ページ 1 / 1
文字コード変換?
Posted: 2010年11月07日(日) 18:42
by lbfuvab
\u5909\u6570a\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002
↑みたいなのを
「変数aを入力してください。」
みたいに戻したいのですが(Javaエンコード?)、どうすればいいのか分かりません。
\u○○○○で一文字表してるみたいなのですが(しかもユニコード)
それをどのようにShift-JISにすればいいのか分かりません。
どうか教えてください。
Re:文字コード変換?
Posted: 2010年11月07日(日) 19:00
by ISLe
環境とかどこに書かれたのをどういう風に戻したいのか分からないのですけど
JavaのSDK(JDK)に付いているnative2asciiツールを-reverseオプション付けて使うと変換できます。
Re:文字コード変換?
Posted: 2010年11月07日(日) 22:55
by lbfuvab
あ、環境書くの忘れてましたね。
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を入力してください。」という文字列に変換してフェイルに保存したいのです。
Re:文字コード変換?
Posted: 2010年11月07日(日) 23:55
by ISLe
\nに続く4桁の16進数が16ビットユニコードの文字コードになります。
C/C++には標準で文字コードを変換する方法が用意されていませんので既存の文字コード変換ライブラリを利用することになります。
VC++2010のfopenで入出力する文字コードを指定できる機能を使うといったんバイナリモードで書き出し文字コードを指定して読み取ることで標準の文字コードに変換することもできます。
あと処理系依存かつ動作保証もできませんが、wchar_t型の変数に文字コードを代入してprintf(fprintf)で出力できるかもしれません。
Re:文字コード変換?
Posted: 2010年11月08日(月) 10:26
by toyo
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);
}
Re:文字コード変換?
Posted: 2010年11月08日(月) 16:46
by ISLe
> 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でしか使えないぞと警告が出たけど。
でもユニバーサルキャラクタ名だとコンパイル時にエンコードされてしまうのでは。
Re:文字コード変換?
Posted: 2010年11月09日(火) 01:28
by lbfuvab
WideCharToMultiByteですか、勉強になりましたm(_ _)m
まぁ、自前でユニバーサルキャラクタをワイド文字化する実装は出来そうなので、これを使わせていただきます。
後、いろいろ調べてみて、諸々の文字コードに対応するならNKFとかiConvとか使った方がいいと分かりました。
まぁ、ユニバーサルキャラクタならユニコードだけで十分ですが・・・
#このユニコードってUTF-16ですよね?