• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:unicodeの出力方法)

猫のUnicode出力方法とは?

このQ&Aのポイント
  • gcc version 4.7.1 (tdm-1)を使用して、Windows7 64bitの環境で猫のUnicode出力方法を調べています。
  • コマンドプロンプトのchcp65001を設定しても、文字化けが発生し、正しい出力結果が得られません。
  • ファイルには猫(944C)という文字が出力されますが、Unicodeのコードポイントである732Bとして出力したいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

wchar_tをwchar_tのまま書き出したい場合,バイナリ列としてfwriteで描き出す必要があります。 以下,C/C++のファイル入出力系関数の仕様について。 Cのファイル入出力系関数は,ファイル自体はマルチバイト文字列である,という前提の関数です in ISO/IEC 9899:1999 Programming languages --C / 7 Library / 7.19 input/output <stdio.h> / 7.19.3 Files ---- 引用 ここから ---- 11 The wide character input functions read multibyte characters from the stream and convert them to wide characters as if they were read by successive calls to the fgetwc function. Each conversion occurs as if by a call to the mbrtowc function, with the conversion state described by the stream’s own mbstate_t object. The byte input functions read characters from the stream as if by successive calls to the fgetc function. 12 The wide character output functions convert wide characters to multibyte characters and write them to the stream as if they were written by successive calls to the fputwc function. Each conversion occurs as if by a call to the wcrtomb function, with the conversion state described by the stream’s own mbstate_t object. The byte output functions write characters to the stream as if by successive calls to the fputc function. ---- 引用 ここまで ---- 上記のように,規格上入力はmbrtowcで変換してwchar_tにし,出力はwcrtombで変換してcharにする,ということになっています。 この変換を避けるには,変換の入るwide character input/output functionsである fgetwc/fgetws/getwc/getwchar/fwscanf/wscanf/vfwscanf/vwscanf/fputwc/fputws/putwc/putwchar/fwprintf/wprintf/vfwprintf/vwprintf の使用を諦める必要があります。 # 2011年に最新のISO規格が出ているため,動作の破壊的変更もしくは補助するための別の関数が追加されているかもしれません。 char16_tなどがあるC++の世界ではどうかというと…… in ISO/IEC 14882:2011 Programming languages --C++ / 27 input/output library / 27.9 File-based streams / 27.9.1 File streams / 27.9.1.1 Class template basic_filebuf ---- 引用 ここから ---- 2 The restrictions on reading and writing a sequence controlled by an object of class basic_filebuf<charT, traits> are the same as for reading and writing with the Standard C library FILEs ---- 引用 ここまで ---- 上記のように,Cと同じように動作するように求められているため,こちらも状況は変わりません。

nekonimatatabi
質問者

お礼

コンソールへのUTF-8の書き出しがまだできませんが、 上記で言われているfrwiteで検索したところ、よいサンプルが あったので見ようみまねでテストしてみました。 下記内容でutf-16で出力できました。 また、仕様を教えてくださりありがとうございます。 sjisでテキストファイルに出力する場合以外は、fwrite/freadで 読み書きするようにします。 #define UNICODE #define _UNICODE #include <stdio.h> #include <iostream> #include <tchar.h> int main () { const TCHAR *str = _T("猫"); const TCHAR *name = _T("a.txt"); FILE *fp; fp = _tfopen(name, _T("w+,ccs=UTF-16LE")); if (fp) { fwrite(str, sizeof(TCHAR), _tcslen(str), fp); fclose(fp); } } ありがとうございました。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

具体的に、どんなことがやりたいのですか? 0x732bという16bitのバイナリを出力させたいのなら、UTF-16BEまたはUTF-16LEである必要があります。 cp65001(UTF-8)で「猫」と出力させるなら、バイト列は(U+732bから符号化した)0xe7,0x8c,0xabの3バイトになります。 setlocale(LC_ALL, "jpn"); でjpnを指定しているので、jpn用のcp932に変換してfwprintf,wprintfが実行されています。 使用したいものに合せて、jpnの部分を変える必要があります

nekonimatatabi
質問者

お礼

localeの意味を調べてみます。 ありがとうございます。

nekonimatatabi
質問者

補足

返信ありがとうございます。 画面出力をUTF-8で出力して、テキストファイルには、UTF-16で書き出したいです。

関連するQ&A