お世話になります。
UNICODE文字列について上手くいかない部分があったので質問します。
(1)ANSI文字コードのテキストファイルをfgetws関数で読み込む
(2)読み込んだ文字列をID3DXFont::DrawTextWメソッドで描画
以上のことを行うと、1バイト文字(半角文字)はきちんと表示されるのに対し、2バイト文字は化けてしまいます。
きちんと表示されるようにするにはどうすれば良いでしょうか?
開発環境:Visual Studio 2005 C++
開発言語:C/C++(Win32API)+DirectX9.0b
ご存知の方がいましたら、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
#1さんの回答について、念のため少し指摘しておくと...
fgetws関数は、「UNICODE 文字列のファイルから UNICODE の文字列を読み込むだけ」という代物ではありません。読み込み対象となるファイルは、あくまでも多バイト文字の並びが格納されていることを想定しています。そして、読み込み際に、setlocale関数で設定されたロケールに基づいて、ワイド文字列への変換が行われます。
No.7
- 回答日時:
ISO/IEC9899では、fgetws自体にbinary streamに対する特別な規定はありません。
また、textであろうがbinaryであろうが、基本的にファイルはマルチバイトを仮定してます。
[Although both text and binary wide-oriented streams are conceptually sequences of wide characters,
the external file associated with a wide-oriented stream is a sequence of multibyte characters, ...]
また。文字(列)入出力関数では以下の変換を規定してます。
[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.]
# the streamはwide-oriented streamにかかります。
標準仕様は、MBSの読み出しに変換を要求してますが、
「UNICODEが読めてはいけない」規定はありませんので、
MSの実装がこのような仕様でもアリな気がしますが、
すべての処理系がこのような動作をする保証はないかと思います。
# 「バイナリの入出力は一切無変換」の処理系だと、このような動作をする気はしますが、
# 少なくとも、私はこの実装を強制する規定は見つけてません。
# 「fgetwsが常にマルチバイトを仮定して変換を試みる(そしておそらく失敗する)」処理系があってもよさそうに思います。
一日で7件もの回答、ありがとうございました。
誠に失礼ながら、皆さんのお礼をまとめてさせていただきたいと思います。
結局、_tsetlocale(LC_CTYPE,TEXT(""));を_fgetts関数の前に挿入することで解決しました。
以前はfgets関数を使用していたのでロケールという概念について無知だったためのミスでした。
おかげさまで上手く動きました。
C#はデフォルトでUNICODEなのに対し、C/C++は後にUNICODEに対応したものですから、VisualStudioの仕様もなかなか難しいですね。
もう少し詳しく勉強したいと思います。
ありがとうございました。
No.6
- 回答日時:
Microsoft の fgetws() のマニュアルには,入力ストリームが
・テキストモードの場合:マルチバイト文字列を読み出し,(ロケールに従って) ワイド文字列に変換する.
・バイナリモードの場合:Unicode 文字列を読み出す.変換は行われない.
と書かれていますが,後者は MS の独自仕様なんでしょうか?
テキスト モードとバイナリ モードの Unicode(TM) ストリーム入出力
http://msdn.microsoft.com/library/ja/default.asp …
No.5
- 回答日時:
既にかかれてますが、fgetwsは
「あくまでも多バイト文字の並びが格納されていることを想定しています。<中略>ワイド文字列への変換が行われます。」
平たく言うと、「マルチバイト文字列のファイル(WindowsならShift-JISが普通。Linuxだと物によりEUCやUTF-8あたり)で書かれたファイルを、
ワイド文字(大抵はUNICODE)の文字列に変換して読み出す」ものなので、
「UNICODEのファイルを読んでも巧く動きません」。
自分で変換がいるのは、むしろファイルがUNICODE等の時です。
# ちなみに、ワイド文字の出力も、読み出し同様にロケールに従った変換が行われます。(ファイルはワイド文字になりません)
No.4
- 回答日時:
★jacta さんへ
・ロケールの設定をすると『fgetws』関数でも文字列の変換が行われるんですか。
・お勉強になりました。
★ketaki さんへ
・というわけで私が紹介した『MultiByteToWideChar』関数を使うよりも『setlocale』関数で
文字列を『fgetws』関数で読み込んだ方が簡単のようです。
・以上。おわり。
参考URL:http://www.bohyoh.com/CandCPP/C/Library/setlocal …
No.1
- 回答日時:
★ANSI文字コードのファイルを fgets 関数で読み込む。
・もともと『ANSI文字コード?』→『シフトJISコード』で書かれたファイルならば
『fgets』関数で一旦読み込んでから、UNICODE 文字列に変換する処理をした後に
DrawTextW メソッドで描画しないと文字化けするのは当然だと思います。
・私は『fgetws』関数は使ったことはありませんが、この関数は UNICODE 文字列の
ファイルから UNICODE の文字列を読み込むだけですから文字コードの変換は質問者
さんがご自分で行って下さい。
アルゴリズム:
(1)『シフトJISコード』で書かれたファイルを『fgets』関数で読み込む
(2)読み込んだ文字列を UNICODE 文字列に変換する
(3)変換した文字列を ID3DXFont::DrawTextW メソッドなどで描画する
最後に:
・『MultiByteToWideChar』関数は、ANSI 文字列などから Unicode 文字列に変換
・『WideCharToMultiByte』関数は、Unicode 文字列から ANSI 文字列などに変換
・以上。おわり。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- 政治 私の発明した「二階建て漢字」は使えるでしょうか? 3 2023/02/08 16:40
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Excel(エクセル) Excel 複数列のある文字を優先して1列に表示したいです 2 2022/12/03 12:07
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- 計算機科学 急ぎです、大学数学再帰の問題難しくてがわからないです。 以下の4つの文字列を連結して新たに生成できる 1 2023/05/17 20:11
- C言語・C++・C# C言語で 英文字のみからなる文字列、”Radar”、”WasItACatISaw”、”a”、””(空 5 2022/12/20 15:17
- Excel(エクセル) 【画像あり】A1が●+B1と同じ文字がB列にある+C1と同じ文字がC列にある場合D1に〇を付ける 3 2023/03/09 18:18
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
fgetsで2行目から文字化け
C言語・C++・C#
-
C言語でUTF-8コードで読み込んで表示は日本語にしたい
C言語・C++・C#
-
fgets で値が取得できない
C言語・C++・C#
-
-
4
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
5
CStringをwchar_tに変換したい
C言語・C++・C#
-
6
Visual Studio プロパティページの『文字セット』の意味?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
16進数の文字列をアスキーコー...
-
fgetws関数で読み込んだUNICODE...
-
カンマの含まれる文字列の数値...
-
数値をASCII文字にする方法につ...
-
VB6.0 Base64のデコード方法を...
-
マクロで半角を全角に
-
VB6 機種依存文字の変換
-
ホームページ作成の初心者です
-
ソースコードの1行が長いとき...
-
VBAのコマンドボタンの文字列の...
-
エスケープ文字の復帰(¥r)と...
-
COBOLの改行
-
全角括弧と全角読点の間隔を狭...
-
文字の入力で横バー上段、中断...
-
エクセルのCOUNTIFが正しくカウ...
-
メッセージボックスで1025文字...
-
記号は半角と全角どちらがよい...
-
文字化け変換方法
-
コンボボックスの項目中に改行を
-
Excel関数「COUNTIF」で”文字”...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
数値をASCII文字にする方法につ...
-
カンマの含まれる文字列の数値...
-
16進数の文字列をアスキーコー...
-
マクロで半角を全角に
-
VC++ マルチバイト文字とUniCod...
-
fgetws関数で読み込んだUNICODE...
-
iPhoneの絵文字をWebサイトに表...
-
16進数の文字列を10進数の数値...
-
外字を削除したい
-
絵文字のフォーム入力について
-
文字数が決まっていないの文字...
-
サロゲートペア文字の半角カナ...
-
マージ型文字列のデリミタ2文...
-
1バイト文字の上位4ビット・...
-
Excel VBAの数値変換
-
シフトJIS⇒MIMEエンコード(RFC2...
-
VB6 機種依存文字の変換
-
VBA ASC関数で変換できない文...
-
ヌル文字とは一体何でしょうか
-
携帯サイトの絵文字の互換性に...
おすすめ情報