文字コード変換?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
lbfuvab

文字コード変換?

#1

投稿記事 by lbfuvab » 14年前

\u5909\u6570a\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002
↑みたいなのを
「変数aを入力してください。」
みたいに戻したいのですが(Javaエンコード?)、どうすればいいのか分かりません。

\u○○○○で一文字表してるみたいなのですが(しかもユニコード)
それをどのようにShift-JISにすればいいのか分かりません。

どうか教えてください。

ISLe

Re:文字コード変換?

#2

投稿記事 by ISLe » 14年前

環境とかどこに書かれたのをどういう風に戻したいのか分からないのですけど
JavaのSDK(JDK)に付いているnative2asciiツールを-reverseオプション付けて使うと変換できます。

lbfuvab

Re:文字コード変換?

#3

投稿記事 by lbfuvab » 14年前

あ、環境書くの忘れてましたね。

OS:Windows7 Pro
開発環境:VC++ 2010 Exp. Edition

>JavaのSDK(JDK)に付いているnative2asciiツールを-reverseオプション付けて使うと変換できます
了解です。ありがとうございます。
しかし、文字コードの勉強もしたいので、↑みたいな文字列をデコードしてShift-JISに変換してファイルに書くまでしたいんです。

具体的に言うと、
仮に、「\u5909\u6570a\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002」が入力されたら
shift-JISの「変数aを入力してください。」という文字列に変換してフェイルに保存したいのです。

ISLe

Re:文字コード変換?

#4

投稿記事 by ISLe » 14年前

\nに続く4桁の16進数が16ビットユニコードの文字コードになります。
C/C++には標準で文字コードを変換する方法が用意されていませんので既存の文字コード変換ライブラリを利用することになります。

VC++2010のfopenで入出力する文字コードを指定できる機能を使うといったんバイナリモードで書き出し文字コードを指定して読み取ることで標準の文字コードに変換することもできます。
あと処理系依存かつ動作保証もできませんが、wchar_t型の変数に文字コードを代入してprintf(fprintf)で出力できるかもしれません。

toyo

Re:文字コード変換?

#5

投稿記事 by toyo » 14年前

VisualC++ならWideCharToMultiByteという関数が使えます
http://msdn.microsoft.com/ja-jp/library/cc448089.aspx

#include <windows.h>
#include <stdio.h>

int main(void)
{
wchar_t src[128] = L"\u5909\u6570a\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002";
char dst[256];
WideCharToMultiByte(932, 0, src, -1, dst, 256, NULL, NULL);
printf("%s", dst);
return(0);
}

ISLe

Re:文字コード変換?

#6

投稿記事 by ISLe » 14年前

> wchar_t src[128] = L"\u5909\u6570a\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002";

↓のコードだとVC++でもgccでも使えます。
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
int main(void)
{
    wchar_t *wstr = L"\u5909\u6570a\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002";
    setlocale(LC_ALL, "");
    printf("%S", wstr);
    return 0;
}
#gccだとユニバーサルキャラクタ名はC++かC99でしか使えないぞと警告が出たけど。

でもユニバーサルキャラクタ名だとコンパイル時にエンコードされてしまうのでは。

lbfuvab

Re:文字コード変換?

#7

投稿記事 by lbfuvab » 14年前

WideCharToMultiByteですか、勉強になりましたm(_ _)m

まぁ、自前でユニバーサルキャラクタをワイド文字化する実装は出来そうなので、これを使わせていただきます。

後、いろいろ調べてみて、諸々の文字コードに対応するならNKFとかiConvとか使った方がいいと分かりました。
まぁ、ユニバーサルキャラクタならユニコードだけで十分ですが・・・


#このユニコードってUTF-16ですよね?

閉鎖

“C言語何でも質問掲示板” へ戻る