
C++ Builderでプログラミングをやっているのですが、
String memo1 = "あいうえお";
という文字列を
unsigned char test_bin[1000];
バイトで宣言した配列に
test_bin[0] = memo1の1バイト目;
test_bin[0] = memo1の2バイト目;
test_bin[0] = memo1の3バイト目;
test_bin[0] = memo1の4バイト目;
test_bin[0] = memo1の5バイト目;
このように、文字列データのバイト数値を数値変数に代入させることはできますでしょうか?
どうぞ、ご教授の程よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
No1です
>このようにコピーした時には文字コードは考慮されないのでしょうか?
何か勘違いされてるような気がしますが文字コードはコピー元の文字で考慮すべき問題です
少なくても strcpy 関数にて文字コードが変化することはありません
元々格納されていた文字列がユニコードなのであればユニコードの文字コードがコピーされ
SJISであればSJISの文字コードがそのままコピーされます
回答頂きありがとうとざいます。strcpy 関数というのがそのままのバイト数値をコピーできる機能と言うことがわかりました。助かります。
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/ …
TByteDynArrayはDynamicArray<Byte>です。
Lengthプロパティで要素数を取得、operator[]で指定したインデックスの要素を取得できます。
詳しいDynamicArrayの使い方はマニュアルをご覧ください。
・System.TByteDynArray - RAD Studio API Documentation
http://docwiki.embarcadero.com/Libraries/XE4/ja/ …
・System.DynamicArray - RAD Studio API Documentation
http://docwiki.embarcadero.com/Libraries/XE4/ja/ …
もう一つの方法として、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.c_str - RAD Studio API Documentation
http://docwiki.embarcadero.com/Libraries/XE4/ja/ …
No.4
- 回答日時:
>このようにコピーした時には文字コードは考慮されないのでしょうか?
されません。
strcpy()はバイト単位でみて'\0'までをコピーするだけです。
バイト単位でなのでUTF-16やUTF-32の文字列コピーには使用できません。
javaのときもそうでしたけど使用する関数のマニュアルなど読まれてますか?
No.2
- 回答日時:
回答できるわけではありませんが文字コードは考慮しなくていいんでしょうか?
この回答への補足
いつもお世話になっております。文字コードに関してなんですが、
strcpy((char*)tmp_bin, memo0.c_str());
このようにコピーした時には文字コードは考慮されないのでしょうか?
tmp_binのバイト配列にデータコピーした際にユニコードを考慮したデータコピーのやり方もありますでしょうか?
回答頂きありがとうございます。
確かにバイナリで文字コードはどうするのかというのはよく聞きますね。
ちょっと前に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にも同じようなことはできないかなという感じです。
今回はとりあえず
あいうえお
というのがどういうバイトで構成されてるのかをそのまま別のバイトにコピーできればいいかなという感じです。
No.1
- 回答日時:
使って無いんで間違ってたらすいません
普通にコピーすればいいだけだと思いますが
(unsigned char* とchar* の違いはキャストすればいいだけのような)
strcpy((char*)test_bin, memo1.c_str()); でできません?
http://yunix.info/BCBHelp/SubstituteCouple_Strin …
回答頂きありがとうございます。
strcpy((char*)tmp_bin, memo0.c_str());
for(int j=0;j<20;j++)
{
test_bin[0+(200*i)+j] = tmp_bin[j];
}
このようなことができますね! 助かります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
COBOLのCOMP形式について
-
10Mバイトて文字数に すると何...
-
バイト列とバイナリ列の違いが...
-
UTF-8で5~6バイトになる文字コ...
-
SQLで1バイト、2バイト混在...
-
エクセルシート名の制限を変更...
-
データの取り出し?
-
テキストBOXの入力制限について
-
unicode←→JISコード
-
ワイド文字のバイト数が取得で...
-
バイト境界とは
-
より高速な画像の表示法
-
Excel 1セル当りの文字数が2...
-
エクセルVBA:日付データの変換...
-
メールの件名をデコードしたい
-
C言語でwin32apiを使ってnotepa...
-
stable diffusionのエラー
-
'dataType' 引数を Null にする...
-
Excel VBA メール作成について ...
-
postで送られてきたパラメータ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
char str[256]の256の意味は?
-
COBOLのCOMP形式について
-
バイト列とバイナリ列の違いが...
-
エクセルシート名の制限を変更...
-
ピクセル,dpiから容量(バイト...
-
ビットスワップとバイトスワッ...
-
テキストBOXの入力制限について
-
機種依存文字をチェックしたい。
-
「1TB」のHDDに日本語は何字入...
-
C++ Builderで文字列をバイトに...
-
全角半角を調べるライブラリ関...
-
SQLで1バイト、2バイト混在...
-
VB6とSQL Serverの桁の扱い方に...
-
jis x 0208 について
-
VBAでShift-JISのURLエンコード
-
この関数はどのプログラミング...
-
COBOL PICTUREで X,S,Vの意味
-
半角、全角の判別方法
おすすめ情報