• 締切済み

C言語で16進数のunicodeを文字に変換したい

C言語初学です。よろしくお願いします。 16進表記のunicodeの文字列データ(もともとは漢字のデータ)があり、 それをもとの文字列として出力したいのですが、 C言語でどういうプログラムを書けば良いのか分からず困っています。 ============================================ 例えば、「0x6F22」というデータがあった場合、 それを文字列に変換して「漢」という字を出力したいのです。 (http://ja.wiktionary.org/wiki/漢) ============================================ C99やC++、PHP、Rubyなどでは、 ユニバーサルキャラクタ(?)というのを使って 一発で変換できるようなのですが、 今回は学習目的というのもあって、 なんとかC言語でできないかと思っています。 おおまかな話でも良いので、 なにか取っ掛かりになる情報のご教示お願い致します。

みんなの回答

回答No.6

> wchar_tの内部表現がunicodeという決まりありましたっけ? 確かに wchar_t = Unicode(UCS2/4) を期待すると移植性なくなりますね。 厳密にやりたいなら ICU 使うとか、そんな対処になるのかと。

参考URL:
http://site.icu-project.org/
  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.5

wchar_tの内部表現がunicodeという決まりありましたっけ? C99からは __STDC_ISO_10646__ が定義されていれば互換性はあるみたいですけど。

回答No.4

#include <stdio.h> #include <stdlib.h> #include <locale.h> int main() { unsigned long value; char* dummy; const char* input = "0x6f22"; unsigned long val = strtoul(input, &dummy, 16); setlocale(LC_ALL,"japanese"); printf("[%C]\n", (wchar_t)val); return 0; }

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.3

>strcat("\u","6f22")とかでは >エラーになってしまいます。  とりあえず "\u"と"6f22"を連結したところで"\u6f22"と同じにはならないです。 学習目的とおっしゃていますが文字コード関連は変換絡むと難易度高いですよ?

mogmogiwa
質問者

補足

>学習目的とおっしゃていますが文字コード関連は変換絡むと難易度高いですよ? 調べている中で確かに敷居の高さを感じます。 javaやpython,rubyといったところでは 一発で変換できるみたいだったので、 Cでも割りと簡単かと思ったんですが そんな甘い感じではないのですね。 処理しようとしているデータが結構膨大なので、 速度の出るCで処理できればと思ったのですが、 C以外の言語も選択肢に入れて勉強してみます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

C99 は「C言語」だから C99 にすれば解決?

mogmogiwa
質問者

補足

> C99 は「C言語」だから C99 にすれば解決? すいません。C99より古いのをなんというのか分からなかったので、 C言語と書いてました。 C99だとエスケープシーケンス(?)というのでしょうか、 "6f22"の前に"\u"を付けて、 printf("%s\n","\u6f22"); のようにすると「漢」が表示されたのですが、 いまそこでまた壁にぶち当たってます。 非常に単純なサンプルで申し訳ないんですが、 例えば下記のようなtest.cで "\u"と"6f22"を連結させたような形で printfに渡したいのですが、 strcat("\u","6f22")とかでは エラーになってしまいます。  基本的なことかもしれませんが、 解決方法ありますでしょうか。 == test.c ======================= #include <stdio.h> int main(void) { char text1[256]="6f22"; char text2[256]; /* ほんとはここで   "\u"とtext1を連結させて、text2とし、   printfに"\u6f22"のような形で渡したい */ printf("%s\n",text2); return 0; } ==================================

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.1

取っ掛かりということなら iconv

mogmogiwa
質問者

補足

下記URLなどを参照したんですが、まだ理解不能状態です・・・ http://www.geocities.jp/sanpontze/web.html 勘違いしてたら申し訳ないんですが、 iconvは文字コード変換(例えばSJIS→UTF-8)で、 私のやりたいことは 「unicodeエスケープシーケンスのデコード」というものらしいので、 iconvは少し目的とは外れるのではないでしょうか。