• 締切済み

Unicodeのテキストファイルを読みたい

Unicode(UTF-8)で作成されたテキストファイルを読み、Shift-JISに変換しメモコントロールに表示したいと思っています。 以下のコードで実行したのですが、文字化けになり正常に表示できません。 開発環境はC++Builder2010です。 char sjis[300]; wchar_t buf[300]; size_t n; setlocale(LC_ALL,"japanese"); while(fgetws(buf,300,fp31) != NULL){ n = wcstombs(sjis,buf,300); Memo1->Lines->Add(sjis); } fgetws関数が問題なのか、wcstombs関数が問題なのか、不明なのです。 アドバイスよろしくお願いいたします。 ちなみに読込んだテキストファイルは、国税局のインボイス登録者データです。 https://www.invoice-kohyo.nta.go.jp/download/index.html

  • CLMN
  • お礼率80% (62/77)

みんなの回答

回答No.1

https://nekko1119.hatenablog.com/entry/2017/01/02/054629 UTF-8 -> Shift_JIS std::string utf8_to_multi_winapi(std::string const& src) { auto const wide = utf8_to_wide_winapi(src); return wide_to_multi_winapi(wide); } こんだけでいいのではないかと。 また、UTF8をUnicodeにすれば、確かに8ビット以上のデータですが、 UTF8自体は「マルチバイト」なので、 1つの文字を複数のバイトで格納しています。 SJISも同じで、8ビット以上の、 (と言っても2バイトにしかならないが) 「マルチバイト」になるだけなので、 どちらも、"char"系のプロトタイプでしょうね。

CLMN
質問者

お礼

早速の回答、ありがとうございました。 結論から申し上げますと、うまく出来ませんでした。 示していただいたコードは、VisualC専用なのでしょうか? 私の開発環境では、utf8_to_wide_winapi関数は未定義の関数、というエラーになってしまいます。 ファイルを1件読んだらbufに格納されているから、これをShift-JISに変換したい訳ですが、示されたコードではうまく出来ないのです。 何か、当方の知識不足で不十分なのかもしれません。

関連するQ&A

  • UNICODE時のファイル入出力について

    【使用環境】 WinXP, VS2005, C++, "Unicode 文字セットを使用する"設定 現在以下のようなコードを試しているのですが、何故か上手くいきません。 マルチバイトの際にWCHARをcharに置き換えたりした場合はちゃんと 動作したのに何故でしょう・・・。 ヘルプから探してみると、ロケールの設定らしきことが書いてありますが、 サンプルが見つからず苦戦しております。 以下のコードをどのように修正すれば正しく読み込めるようになるのでしょうか・・。 --- コード ------------------------------------------------- #include <iostream> #include <cstdio> #include <cstdlib> #include <windows.h> using namespace std; // 1行読み込んで返す関数 WCHAR * LoadFile( WCHAR * FilePath ){  static WCHAR Buf[ 256 ] ={0};  FILE * fp = _wfopen( FilePath, L"r" );  fgetws( Buf, 256, fp );  fclose( fp );  return Buf; } int main(){  WCHAR * text = LoadFile( L"test.txt" );  cout << text; } --- 読み込むファイルの中身の文字列:test.txt --------------- aあ --- 実行結果 ----------------------------------------------- 00417178続行するには何かキーを押してください . . .

  • unicodeの表示

    C言語でプログラミングをしているのですが、unicodeの表示方法がよくわかりません。┌という文字(unicodeでU+250C)を表示したく、wchar_t型など調べたのですがプログラムの書き方がよくわかりませんでした。unicodeを直接指定する方法か'┌'のように直接指定する方法が知りたいです。アドバイスお願いします。

  • Unicode

    先日は文字コードについて色々助言してくださりありがとうございました。 おかげさまでJIS,EUC,SJISの変換はできましたが、 Unicodeについて詰まっているところがあります。 SJIS→UnicodeはSJISにあったU+XXXXに変換し、 それを1~4バイトにさらに変換して文字表記されることで出来ます。 後者の1~4バイトにさらに変換するやり方は出来ているのですが、 前者のSJISにあったU+XXXXに変換するところで詰まっています。 ##SJIS Unicode Name Note 0x00 U+0000 # <control> 0x01 U+0001 # <control> 0x02 U+0002 # <control> 0x03 U+0003 # <control> 0x04 U+0004 # <control> 0x05 U+0005 # <control> 0x06 U+0006 # <control> 0x07 U+0007 # <control> : : こういった変換表(テキストファイル)があるのですが、 どのようにしたらこのファイルをプログラム上で操作? できるのでしょうか? 例)SJISで0x07→U+0007→1~4バイト変換の 0x07→U+0007部分についてです。 また、逆に変換する際の0x07←U+0007についても わからないでいます。 何かヒントをください。

  • Unicodeで編集できるテキストエディタってありますか?

    これまで「Unicode対応」を謳ったエディタの多くは 「Unicodeテキストの読み書きが出来る」エディタに過ぎませんでした。 つまりファイルを読み込むときにUnicode→シフトJISに変換し、編集は シフトJIS環境で行う……という。 保存も同様でシフトJIS→Unicode変換したのち保存します。 これだと確かにUnicodeテキストの読み書きは出来ますが、 Unicode最大に特徴であるJIS外文字のが入っているとシフトJIS変換時に 「?」になってしまいます。 編集もUnicode環境で行えて、Unicodeフォントを指定してやればJIS外文字も 表示できる、そんなフリーエディタってありませんか? 最近の「秀丸」で出来るようになったのは知ってるんですが……

  • ファイルの入出力でのテキスト モードでの変換について

    今までとりあえずサクサク骨組み作りたいので、短くかけるためマルチバイト文字主体で来たのですが ここらへんでUnicode文字のことが気になってきたので、以下のような関数を基本にしてプロパティやコードをいじったりしつつ入出力を色々試してみたのですが… (エラー時の処理とか省略します。) #include <TCHAR.h> #include <stdio.h> #include <locale.h> #ifdef _UNICODE #define 文字セット "Unicodeを使用" #else #define 文字セット "マルチバイトを使用" #endif void f(){ _tsetlocale(LC_ALL, _T("japanese")); FILE *fp; if ( _tfopen_s( &fp, _T("exp.txt"), _T("wb") ) ) return; _ftprintf( fp ,_T(文字セット)); fclose(fp); } ファイルサイズや出力内容を見てみると、Unicode文字を使う場合、このようにバイナリモードで書き込みをすると、バイト数が、単純にsizeof(wchar_t)*文字数になってしまうようで 気になったので調べてみると、こういうことみたいですね。 http://msdn.microsoft.com/ja-jp/library/c4cy2b8e%28VS.80%29.aspx 最後の方に >Unicode ストリーム入出力関数をバイナリ モードで実行すると、ファイルが Unicode であると想定されるため、入出力時に CR-LF 変換も文字変換も行われません。 と書いてありますが これは、ただしつまり Unicodeを扱う場合でも、結局バイナリモードで出力したらバイナリモードで入力すれば正しい同じデータが得られるし、テキストモードで出力したらテキストモードで入力すれば大丈夫と考えて良いですよね? 言い換えれば、少なくともUnicodeでテキストモードだと、CR-LF 変換と文字変換が行われてしまうということで (少なくともマルチバイトなら文字変換はなしでしょうが) 「文字変換」については今回初めて知りました。 他にはマルチバイト・Unicode問わず、テキストモードを使用すると、何か変換が行われる可能性はあるのでしょうか?

  • VBScript Unicodeテキスト読み書き

    VBScriptで存在するUnicodeテキストファイルを開き、別途、Unicodeテキストファイルを作成し、存在する方のテキストファイルから1行ずつ読み込んで、作成したテキストファイルに、そのまま書き込むだけのプログラムを組みました。 それなのに、新たに出来たテキストファイルは文字化けしてしまっています。 どうすればいいのでしょうか? Option Explicit Dim a, w, x, y, z Set w = CreateObject("Scripting.FileSystemObject") Set x = w.GetFolder(".") Set y = w.OpenTextFile(x & "\Test.txt", 1, True) Set z = w.CreateTextFile(x & "\Result.txt", True, True) Do Until y.AtEndOfLine = True a = y.ReadLine z.WriteLine(a) Loop z.Close y.Close Set z = Nothing Set y = Nothing Set x = Nothing Set w = Nothing MsgBox("Finished!") 元々存在するテキストファイルは、テキストエディタで開いて、間違いなく文字コードが「Unicode」であることは確認していますし、新たに作成されたテキストファイルも、エディタで開くと、文字コードが「Unicode」である旨、表示されています。 元々存在するファイルの中に、「Unicode」文字がたくさん含まれていますので、どうしても、「Unicode」で処理しなければなりません。 もちろん、プログラムは、本当はもっと他のことをするために作るのですが、最初のこの部分でつまづいてしまっています。 お分かりになる方、お教えください。

  • unicodeの出力方法

    環境です。 gcc version 4.7.1 (tdm-1) windows7 64bit コマンドプロンプト chcp65001 #include <stdio.h> #include <stdlib.h> #include <wchar.h> #include <locale.h> intmain(int argc, char *argv[]) { FILE *fp; fp = fopen(argv[1],"w+"); wchar_t aaa[30] = L"猫"; setlocale(LC_ALL, "jpn"); fwprintf(fp,L"猫"); wprintf(L"%ls",aaa); for(int i=0;i<30;i++){ wprintf(L"%lx",aaa[i]); } fclose(fp); return 0; } 実行結果が以下のようになります。 chcp 932---猫732b00000000000000000000000000000 chcp 65001 ----文字化け732b00000000000000000000000000000 テキストファイルの内容 猫(944C) どのようにすれば、猫(732B)として出力できるでしょうか。 教えてください。

  • HTMLユニコード(数値文字参照)の復元

    10進HTMLユニコードを基のunicodeに変換したいのですが、どなたか、ご存知ないでしょうか。 こちらの環境はWindowxXp Borland C++ Builder6です。 今、「【」から12301を16進化して3010とし、これに無理やり、「\u」と「3010」を結合させてみたのですが、出力表示はu3010と失敗でした。 うまく行けば、「【」となるはずでしたが・・・・・・。 Web検索したところ、APIなどの変換のための関数が見つからないで自作したいと思っています。 宜しくお願いします。

  • バイナリファイルのデータから特定の番地のHEXデータの表示方法

    現在、バイナリファイルのデータから特定の番地のデータだけをテキストボックスに表示させたいというプログラムを作成しております。 特定番地は0x1F65番地~の6バイトを抜き出し、そのHEXデータをテキストボックスにそのHEXがわかるテキストデータとして表示させたいと考えているのですが、この場合どのようにコーディングしたらよいのでしょうか。 現在のプログラムは private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { //指定したファイル名でStreamReaderを設定する try{ System::IO::StreamReader^ sr = gcnew System::IO::StreamReader("sample.bin"); //受け皿 array<wchar_t>^ buf=gcnew array<wchar_t>(6); //先頭から0x1f63バイト動かす sr->BaseStream->Seek(0x1f65,System::IO::SeekOrigin::Begin); //2バイト読み込む sr->Read(buf, 0, buf->Length); //此処でテキストボックスに入れる this->textBox1->Text= gcnew System::String(buf); } catch(System::Exception^ ex){ System::Windows::Forms::MessageBox::Show(ex->ToString()); } //this->textBox1->Text = L"変更1"; this->textBox2->Text = L"変更2"; this->textBox3->Text = L"変更3"; } コマンドボタンを押して、特定番地をBUFに入れた後テキストボックスに代入しています。これだとAsciiコードに準じたの文字が表示されてしまうので、そのHEX番号がわかるようにテキストボックスに入れたいとおもっています。 どうぞ、ご教授よろしくお願いいたします。

  • バイナリファイルのデータから特定の番地のHEXデータを18バイトとって表示方法すると文字化けする。

    現在、Visual C++ 2008 Express Editionでバイナリファイルを読み込んで、このファイルの0x1F65番地から18バイトを取得して、それをテキスト変換してテキストボックスに表示したいプログラムを作成しています。 バイナリデータをテキストデータに変換するプログラムを教えていただいて、それができたので、今度はもう少し長い18バイトを取得して、テキスト変換してテキストボックスに表示させようとしたのですが、バイナリデータとは違うデータが表示されるようになってしまいました。 どうしてこうなるのか原因がわからない状態です。 どなたか原因がわかるかたいらっしゃいませんでしょうか。どのように修正すれば良いかご教授お願いいたします。 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { //指定したファイル名でStreamReaderを設定する try{ System::IO::StreamReader^ sr = gcnew System::IO::StreamReader("sample.bin"); //受け皿 array<wchar_t>^ buf=gcnew array<wchar_t>(18); //先頭から0x1f65バイト動かす sr->BaseStream->Seek(0x1f65,System::IO::SeekOrigin::Begin); //18バイト読み込む sr->Read(buf, 0, buf->Length); //此処でテキストボックスに入れる this->textBox1->Text= this->ToHEXString(buf); } catch(System::Exception^ ex){ System::Windows::Forms::MessageBox::Show(ex->ToString()); } //this->textBox1->Text = L"変更1"; this->textBox2->Text = L"変更2"; this->textBox3->Text = L"変更3"; }

専門家に質問してみよう