
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で質問しましょう!
似たような質問が見つかりました
- UNIX・Linux bashでシングルクォート内の変数の組み込み方教えてください。 2 2023/02/14 19:30
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- その他(プログラミング・Web制作) test([)コマンドによる条件判定 2 2022/08/10 12:28
- Visual Basic(VBA) VBA ユーザーフォームからSubプロージャ―に値を引き渡す方法 3 2023/04/09 01:54
- C言語・C++・C# 【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法 4 2023/05/09 15:08
- Excel(エクセル) フォルダ内のエクセルファイルを開かずにデータ採取する関数式 2 2022/12/22 22:15
- その他(プログラミング・Web制作) プログラミング python pandas 固定長データの出力 2 2022/08/16 11:22
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
エクセルシート名の制限を変更...
-
ソケット通信の受信サイズ
-
機種依存文字をチェックしたい。
-
char str[256]の256の意味は?
-
機種依存文字の変換について
-
「1TB」のHDDに日本語は何字入...
-
3バイト文字(UTF-8)をprintfで...
-
バイナリとBCDコード
-
VBAでUnicodeしか存在しない文...
-
VB6とSQL Serverの桁の扱い方に...
-
Javaで日本語1文字のバイト数
-
2byte文字の判定
-
SQLで1バイト、2バイト混在...
-
COBOLのCOMP形式について
-
windowsのファイルパス最大文字数
-
バイト列とバイナリ列の違いが...
-
64bit対応
-
文字列の最後の一字を削除
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
char str[256]の256の意味は?
-
エクセルシート名の制限を変更...
-
バイト列とバイナリ列の違いが...
-
VBAでShift-JISのURLエンコード
-
機種依存文字をチェックしたい。
-
ピクセル,dpiから容量(バイト...
-
GetWindowTextでアドレスバーか...
-
この関数はどのプログラミング...
-
ソケット通信の受信サイズ
-
:(コロン)のKeyCode
-
COBOL PICTUREで X,S,Vの意味
-
memcmp バイナリデータの比較方法
-
より高速な画像の表示法
-
半角、全角の判別方法
-
最大長を用意せずにバイナリデ...
-
64bit対応
-
バイナリとBCDコード
おすすめ情報