- ベストアンサー
C++ Builderで文字列をバイトにする方法
- C++ Builderで文字列をバイトに変換する方法について教えてください。
- C++ Builderで文字列をバイトに変換し、数値変数に代入する方法を教えてください。
- C++ Builderのプログラムで文字列データをバイト数値として扱う方法を教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
No1です >このようにコピーした時には文字コードは考慮されないのでしょうか? 何か勘違いされてるような気がしますが文字コードはコピー元の文字で考慮すべき問題です 少なくても strcpy 関数にて文字コードが変化することはありません 元々格納されていた文字列がユニコードなのであればユニコードの文字コードがコピーされ SJISであればSJISの文字コードがそのままコピーされます
その他の回答 (4)
- 山本 隆(@tyamamoto)
- ベストアンサー率60% (12/20)
C++Builderのバージョンが記載されていませんので、C++Builder 2009以降のバージョン(2009/2010/XE/XE2/XE3/XE4)を前提に話をします。 C++Builder 2009以降では、String型はUnicodeString型になっています。 typedef UnicodeString String; UnicodeStringからバイト配列を取得するには、TEncodingのGetBytesメソッドを使用します。 //UTF-16 TByteDynArray bytes = TEncoding::Unicode->GetBytes(memo0); //UTF-8 TByteDynArray bytes = TEncoding::UTF8->GetBytes(memo0); //OSの標準の文字コード(日本語WindowsならShift_JIS) TByteDynArray bytes = TEncoding::Default->GetBytes(memo0); //特定の文字コードを指定する例(ここではコードページ20932(EUC-JP)を指定している) TEncoding* enc = TEncoding::GetEncoding(20932); TByteDynArray bytes = enc->GetBytes(memo0); delete enc; ・System.SysUtils.TEncoding - RAD Studio API Documentation http://docwiki.embarcadero.com/Libraries/XE4/ja/System.SysUtils.TEncoding TByteDynArrayはDynamicArray<Byte>です。 Lengthプロパティで要素数を取得、operator[]で指定したインデックスの要素を取得できます。 詳しいDynamicArrayの使い方はマニュアルをご覧ください。 ・System.TByteDynArray - RAD Studio API Documentation http://docwiki.embarcadero.com/Libraries/XE4/ja/System.TByteDynArray ・System.DynamicArray - RAD Studio API Documentation http://docwiki.embarcadero.com/Libraries/XE4/ja/System.DynamicArray もう一つの方法として、AnsiStringに変換してc_str()メソッドを使用する方法もあります。 //OSの標準の文字コード(日本語WindowsならShift_JIS) AnsiString sjis = memo0; char* c = sjis.c_str(); //特定の文字コードを指定する例(ここではコードページ20932(EUC-JP)を指定している) AnsiStringT<20932> eucjp = memo0; char* c = eucjp.c_str(); //UTF8(UTF8StringはAnsiStringT<65001>) UTF8String utf8 = memo0; char* c = utf8.c_str(); ・System.AnsiStringT - RAD Studio API Documentation http://docwiki.embarcadero.com/Libraries/XE4/ja/System.AnsiStringT ・System.AnsiStringT.c_str - RAD Studio API Documentation http://docwiki.embarcadero.com/Libraries/XE4/ja/System.AnsiStringT.c_str
お礼
回答頂きありがとうございます。C++ Builder 2009を使っているので、とても参考になります。助かります。
- wormhole
- ベストアンサー率28% (1626/5665)
>このようにコピーした時には文字コードは考慮されないのでしょうか? されません。 strcpy()はバイト単位でみて'\0'までをコピーするだけです。 バイト単位でなのでUTF-16やUTF-32の文字列コピーには使用できません。 javaのときもそうでしたけど使用する関数のマニュアルなど読まれてますか?
お礼
回答頂きありがとうございます。詳しい解説頂き助かります。
- wormhole
- ベストアンサー率28% (1626/5665)
回答できるわけではありませんが文字コードは考慮しなくていいんでしょうか?
お礼
回答頂きありがとうございます。 確かにバイナリで文字コードはどうするのかというのはよく聞きますね。 ちょっと前にjavaで同じようなことをやろうとしてたら String str = "あいうえお"; byte[] utf8 = str.getBytes("UTF-8"); byte[] utf16 = str.getBytes("UTF-16"); byte[] utf32 = str.getBytes(Charset.forName("UTF-32")); byte[] win31 = str.getBytes(Charset.forName("Windows-31j")); このような感じでバイトにできるようなので、c++ Builderにも同じようなことはできないかなという感じです。 今回はとりあえず あいうえお というのがどういうバイトで構成されてるのかをそのまま別のバイトにコピーできればいいかなという感じです。
補足
いつもお世話になっております。文字コードに関してなんですが、 strcpy((char*)tmp_bin, memo0.c_str()); このようにコピーした時には文字コードは考慮されないのでしょうか? tmp_binのバイト配列にデータコピーした際にユニコードを考慮したデータコピーのやり方もありますでしょうか?
- koi1234
- ベストアンサー率53% (1866/3459)
使って無いんで間違ってたらすいません 普通にコピーすればいいだけだと思いますが (unsigned char* とchar* の違いはキャストすればいいだけのような) strcpy((char*)test_bin, memo1.c_str()); でできません? http://yunix.info/BCBHelp/SubstituteCouple_String.html
お礼
回答頂きありがとうございます。 strcpy((char*)tmp_bin, memo0.c_str()); for(int j=0;j<20;j++) { test_bin[0+(200*i)+j] = tmp_bin[j]; } このようなことができますね! 助かります。
お礼
回答頂きありがとうとざいます。strcpy 関数というのがそのままのバイト数値をコピーできる機能と言うことがわかりました。助かります。