• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C++ Builderで文字列をバイトにする方法)

C++ Builderで文字列をバイトにする方法

このQ&Aのポイント
  • C++ Builderで文字列をバイトに変換する方法について教えてください。
  • C++ Builderで文字列をバイトに変換し、数値変数に代入する方法を教えてください。
  • C++ Builderのプログラムで文字列データをバイト数値として扱う方法を教えてください。

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

  • ベストアンサー
  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.3

No1です >このようにコピーした時には文字コードは考慮されないのでしょうか? 何か勘違いされてるような気がしますが文字コードはコピー元の文字で考慮すべき問題です 少なくても strcpy 関数にて文字コードが変化することはありません 元々格納されていた文字列がユニコードなのであればユニコードの文字コードがコピーされ SJISであればSJISの文字コードがそのままコピーされます

diy_sunny
質問者

お礼

回答頂きありがとうとざいます。strcpy 関数というのがそのままのバイト数値をコピーできる機能と言うことがわかりました。助かります。

その他の回答 (4)

回答No.5

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

diy_sunny
質問者

お礼

回答頂きありがとうございます。C++ Builder 2009を使っているので、とても参考になります。助かります。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.4

>このようにコピーした時には文字コードは考慮されないのでしょうか? されません。 strcpy()はバイト単位でみて'\0'までをコピーするだけです。 バイト単位でなのでUTF-16やUTF-32の文字列コピーには使用できません。 javaのときもそうでしたけど使用する関数のマニュアルなど読まれてますか?

diy_sunny
質問者

お礼

回答頂きありがとうございます。詳しい解説頂き助かります。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.2

回答できるわけではありませんが文字コードは考慮しなくていいんでしょうか?

diy_sunny
質問者

お礼

回答頂きありがとうございます。 確かにバイナリで文字コードはどうするのかというのはよく聞きますね。 ちょっと前に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にも同じようなことはできないかなという感じです。 今回はとりあえず あいうえお というのがどういうバイトで構成されてるのかをそのまま別のバイトにコピーできればいいかなという感じです。

diy_sunny
質問者

補足

いつもお世話になっております。文字コードに関してなんですが、 strcpy((char*)tmp_bin, memo0.c_str()); このようにコピーした時には文字コードは考慮されないのでしょうか? tmp_binのバイト配列にデータコピーした際にユニコードを考慮したデータコピーのやり方もありますでしょうか?

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

使って無いんで間違ってたらすいません 普通にコピーすればいいだけだと思いますが (unsigned char* とchar* の違いはキャストすればいいだけのような) strcpy((char*)test_bin, memo1.c_str());  でできません? http://yunix.info/BCBHelp/SubstituteCouple_String.html

diy_sunny
質問者

お礼

回答頂きありがとうございます。 strcpy((char*)tmp_bin, memo0.c_str()); for(int j=0;j<20;j++) { test_bin[0+(200*i)+j] = tmp_bin[j]; } このようなことができますね! 助かります。