• 締切済み

UTF_16からUTF_8への変換で困っています。

初めまして、こんにちは。 いきなりなのですが、C言語のプログラムをしていて聞きたいことがあります。 ユニコードのUTF_16で取得したデータを、UTF_8に変換するにはどうしたらいいですか?? 色々自分なりに探してみたのですが見当たりませんでした。 知っている方がいればよろしくお願いします。 あとWindowsAPIとはなんでしょうか??友人にその中にあるよと言われたのですが、C言語(プログラム自体)を始めたばかりなのでよく理解できません。 みなさんよろしくお願いします。

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

UTF-16からUTF-8への変換、またはその逆は、単純な計算で行うことができます。参考URLを見るなどして、自分で作ってみてください。 WideCharToMultiByteでもある程度のことはできますが、BOMの有無やサロゲートの対応可否など、細かな制御を行うには自作した方が便利です。 それに、WideCharToMultiByteでは環境に依存してしまいますが、自分で計算すれば環境には依存しません。

参考URL:
http://seclan.dll.jp/ccutffaq.htm
noname#153284
質問者

お礼

返信ありがとうございます。 教えてくださったURLを参考にしてみます。 また聞いてしまうことがあると思いますが、その時はよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
noname#50176
noname#50176
回答No.1

WideCharToMultiByte 関数ですね? WideCharToMultiByte(CP_UTF8,Unicode バッファ,-1,バッファ,バッファの長さ,0,0); のような感じです。 ・WindowsAPI について 検索すれば出ると思うのですが、簡潔に示します。 API=Application Programming Interface の略で その名の通り、プログラミング用のインターフェイス(仲介役)です。 パソコンで何か動作をさせる際、画面表示やキー入力など本来は ハードウェアデバイスに機械語で指令記述するのですが、 命令手順の敷地が広すぎたり、機種ごとに異なるなどの不都合を なくすためシステムコールというあらかじめ手順が用意されている サブルーチンを API関数が、簡単な引数で呼び出します。 さらに、文字列の計算、変換、など便宜的なものもあります。 簡単に言うと、OS の多数機能や体裁を簡単な関数呼び出しで実現 できるものです。 尚、VisualBasic で使われるコンポーネント(例えばファイルを開く のダイアログ時に使用する、プロパティやメソッドを実装した ポリモーフィズムオブジェクト)は、API の呼び出しを内部で行って います。

noname#153284
質問者

お礼

返信ありがとうございます。 UTFの件、色々とやってみます! わからなくなったら聞いてしまうかと思いますが、その時はまたよろしくお願いします。 APIは、プログラムを組んでいるときに使っている関数なんかが当てはまると考えればよろしいですか??例えば、レジストリからデータを取ってくるような関数ですか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • UTF-16からUTF-8への変換

    こんにちは。 UTF-16からUFT-8への変換で困っています。 CSVファイルの中にbase64でエンコードされたデータがあり、その中にUTF-16(リトルエンディアン)のデータが埋め込まれています。 base64のデータのデコードは、MIME::Base64のdecode_base64で出来ました。 この中から、文字列を取り出して、uft-8に変換したいのですが、なにかうまい方法はないものでしょうか?

    • ベストアンサー
    • Perl
  • UTF-8とUnicodeの互換性

    Windowsで使用されているUnicodeはUTF-16と理解しているのですが、 UTF-16→UTF-8は変換できると思いますが、 UTF-8→UTF-16の変換は一意に変換されるものなのでしょうか? UTF-16は2バイトなので65,535文字が上限になり、 一方UTF-8は1~6バイトで、実質データ部は最大4バイトなので 表現できる文字数が違うので「UTF-8→UTF-16」の完全変換は無理なのでは?と思っています。 ご存知の方すみませんがどうぞご教授ください。

  • シフトJISからUTF-8に変換

    UNIX系OSのC言語で文字列をシフトJISからUTF-8に変換する方法をご存知の方がいらっしゃいましたらご教授下さい。 なにとぞ宜しくお願いいたします。

  • EUCからUTF-8へのコード変換

    いつもお世話になっております。 C++でEUC-JPで書かれた文字列をUTF-8に変換するプログラムを作成したいのですが、変換ルーチン(TBL等)をどのように書けば良いか分かりません。 サンプル等があれば教えて頂けないでしょうか? 提供されているライブラリ等は使用しない(できない)予定ですのでお願いします。

  • UTF_16で取得しUTF_8で出力したい!!

    こんにちは。 C言語初心者です。以前この件で質問させていただいたのですがエラーがとれず、もう一度質問してしまいました。 今回は、C言語でレジストリからデータをUTF_16で取得し、UTF_8で表示すると言うプログラミングを組みたいのですがどうしても下記のコードではエラーが出てしまいどうしていいかわかりません。 エラーの内容としては、16から8に変換する部分のutf8Sizeの部分で上手くいっていないようで、、、 どうしたらいいかわからないので、もし知っている方がいればよろしくお願いします。 #include<windows.h> #include<stdio.h> void QueryValue(void); int main(void){    QueryValue();    return 0; } void QueryValue(void){    HKEY hkey;    DWORD ValueType;    DWORD ValueSize;    wchar_t Value[1000];    char *utf8String = 0; // UTF-8 文字列バッファへのポインタ    size_t utf8Size = 0; // UTF-8 文字列のバイト数 (終端 NUL 含む) int result; // WideCharToMultiByte() の戻り値    /*レジストリキーのオープン*/    RegOpenKeyEx(      HKEY_LOCAL_MACHINE,         L"SOFTWARE\\Hitachi\\JP1/RemoteControlManager",      0,      KEY_ALL_ACCESS,      &hkey);     ValueSize = 1000;   /*レジストリ値の取得*/    RegQueryValueEx(      hkey,      L"ProgramName",      NULL,      &ValueType,      (LPBYTE)Value,      &ValueSize);    /*結果の表示(シフトJIS変換’%S’)*/    if(ValueType == REG_SZ) printf("%S\n",Value);    else printf("....can't read\n"); /*****************************************************/    //UTF_16からUTF_8変換を行う    result = WideCharToMultiByte(      CP_UTF8,      WC_NO_BEST_FIT_CHARS,      Value,      -1,      utf8String,      utf8Size,      NULL,      NULL);    if(result <= 0){      fprintf(stderr,"UTF_16→UTF_8変換エラー(%lu)\n",GetLastError());    }    /*結果の表示()*/    if(ValueType == REG_SZ) printf("%s\n",utf8String);    else printf("....can't read\n");    /*UTF_8文字列バッファを開放する*/    free(utf8String); /************************************************/    /*終了*/    RegCloseKey(hkey); }

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

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

  • UTF8→ShiftJISに変換したいです!

    VC++2010, MFCです。 参考ページ(↓)でできそうだったのですが、 http://www.sutosoft.com/oldroom/devdiary/20020504.html UTF-8からShift_JISにしたいのは、メディアプレーヤーで作られた wpl ファイルも扱いたいからです。 具体的にいうと、ファイル一覧に プレイリストがあった場合、展開してメディアプレイヤーで開いて、再生後 【m3u ファイル】に(コーディングで)アウトプットするのが目的です。 ShiftJISに変換して、いったんファイルに出力してから、再度読込処理を行ってもかまいません。 BOOL C○○Dlg::UTF8ToShiftJIS(const CString& src, CString* dest) {  int sizeOfString = (src.GetLength() + 1);  LPWSTR lpsz = new WCHAR[sizeOfString];  //LPSTR lpsz = new char[ sizeOfString ];  _tcscpy_s(lpsz, sizeOfString, src);    //strcpy_s(lpsz,sizeOfString, src);  //delete[] lpsz //http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200612/06120010.txt //char* orig = "Hello, World"; char* nstring; nstring = new char[sizeOfString]; strcpy_s(nstring,sizeOfString, (LPCSTR)(lpsz)); // ●UTF8からUnicodeに変換した場合の長さを求める。●  //http://msdn.microsoft.com/ja-jp/library/cc448053.aspx  //const_cast<LPTSTR>(static_cast<LPCTSTR>(str)  int iWideLength = ::MultiByteToWideChar(CP_UTF8, 0,【1】nstring, src.GetLength(), NULL, 0);  if (iWideLength == 0)return FALSE;  LPWSTR lpWideString = new WCHAR[iWideLength];  int iLength;  if (    // ●UTF8からUnicodeに変換する。●    (::MultiByteToWideChar(CP_UTF8, 0, 【2】nstring, src.GetLength(), lpWideString, iWideLength) == 0)    // ●UnicodeからShift_JISに変換した場合の長さを求める。●    || ((iLength = ::WideCharToMultiByte(CP_ACP, 0, lpWideString, iWideLength, NULL, 0, NULL, NULL)) == 0)    // ●UnicodeからShift_JISに変換する。●        //http://msdn.microsoft.com/ja-jp/library/cc448089.aspx    || (::WideCharToMultiByte(CP_ACP, 0, lpWideString, iWideLength, 【3】(LPSTR)dest->GetBuffer(iLength), iLength, NULL, NULL) == 0)){    // ●変換に失敗●    delete lpWideString;    return FALSE;  }  // ●変換に成功●  delete lpWideString;  dest->ReleaseBuffer();  return TRUE; } ・・・という風に少し修正をして、次のソースで呼び出しています。  CString src;  CFile file;  if (file.Open(FilePath, CFile::modeRead)){   DWORD iLength = file.GetLength();   //CString src;   file.Read(src.GetBuffer(iLength), iLength);   file.Close();   src.ReleaseBuffer(iLength);   CString dest;   if (UTF8ToShiftJIS(src, &dest) ==TRUE){    MessageBox (dest);   }   // ●この時点で、destにShift_JISに変換された文字列が格納されている。  } 以下(↓)を参考に、【1】~【3】の部分で、他のパターンもキャストしてみたのですが・・・ /* http://d.hatena.ne.jp/shikaku/20090519/p3 ■[CPP][VC]LPCSTRなどのVC++の紛らわしい定義の意味 一見正体不明のVC++オリジナル定義。よーくみれば違いが分かる。名前 意味 LP *(ポインタ) C const TSTR TCHAR(char) STR char WSTR WCHAR(ユニコード用:2byte) ゆえに定義 正体 LPSTR char* LPCSTR const char* LPTSTR TCHAR* LPCTSTR const TCHAR* LPWSTR WCHAR* LPCWSTR const WCHAR* となる。+/ できるだけスマートに記述したいです。エクセル版を作っていたときは、CreateObject("ADODB.Stream")を使っていたみたいです。ただ、VC++でどう書けばいいか、分かりませんυ UTF8→UTF16→ShiftJIS ←これは、あまり、使いたくない 変換 です。 後は、これも参考になりそうですが、 http://www.softist.com/programming/sjis-utf8/sjis-utf8.htm bufUTF8を何型でどこで宣言すればいいのか?分かりません。 これも(↓)はてなです。 http://www.s-cradle.com/developer/sophiaframework/sf_reference/ref.SFXTextEncoding.html 何回も試しましたが、TRUEが返ってきても、変換前と変換後をMessageBoxで比べてみても、変わりがなく、漢字や記号の羅列でしかありません。どうか教えてください。

  • C言語にてコード変換する方法

    C言語でSJISデータをUTF8データに変換することって可能でしょうか? クライアントはWinNTでサーバがUnixであり、 ある設定データのコードを変換したいのですが、簡単にできる関数など ありますでしょうか?

  • UTF-8での保存について

     エディットボックスに入力してある日本語の文字列をUTF-8やUTF-8Nでテキストファイルに保存したのですがうまくいきません。  UTF-8の場合はファイルの先頭に3バイトのBOMをつければいいらしいので、 ファイルの先頭に0xEF,0xBB,0xBFの3バイトを追加してテキストファイルに保存しましたがメモ帳で開くと文字化けします(メモ帳で開くときは文字コードをUTF-8にして開いてます)。 作成したテキストファイルをバイナリエディタで開いてみると先頭の3バイトはEFBBBFとなっているので何も問題はないと思うのですが、どうして文字化けするファイルができてしまうのでしょうか? --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

  • 文字コード判別・変換について(JIS⇒UTF-8)

    あるサーバからのXMLファイルを、HTMLファイルへ加工するプログラムを作成しています。 INPUTのXMLファイルが仕様により、UTF-8、S-JIS、JIS、ISO-8859-1が同一ファイル内で混ざった状態で送られてくるのですが、(1)入力文字のコードを判別できる関数(もしくはプログラム)、(2)JIS⇒UTF-8文字列変換関数(もしくはプログラム)について、ご教授下さい。 【環境】 OS:WindowsXP 言語:VBS(又はPerl)