2

バイト配列 (Word 文書のテキストを含む) を LPTSTR (wchar_t *) オブジェクトに変換する際に問題が発生しているようです。コードが実行されるたびに、大量の不要な Unicode 文字が返されます。

どこかで適切な呼び出しを行っていないか、変数を適切に使用していないためだと思いますが、これにアプローチする方法がよくわかりません。うまくいけば、ここの誰かが私を正しい方向に導くことができます.

最初に、C# コードを呼び出して Microsoft Word を開き、ドキュメント内のテキストをバイト配列に変換します。

byte document __gc[];
document = word->ConvertToArray(filename);

ドキュメントの内容は次のとおりです。

{84, 101, 115, 116, 32, 68, 111, 99, 117, 109, 101, 110, 116, 13, 10}

最終的には次の文字列になります: "Test Document"。

次のステップは、メモリを割り当てて、バイト配列を LPTSTR 変数に格納することです。

byte __pin * value;

value = &document[0];

LPTSTR image;
image = (LPTSTR)malloc( document->Length + 1 );

メモリの割り当てを開始する行を実行すると、イメージ変数が不要な Unicode 文字でいっぱいになります。

췍췍췍췍췍췍췍췍﷽﷽����˿於潁

そして、memcpy を実行してすべてのデータを転送します

memcpy(image,value,document->Length);

これにより、不要な Unicode 文字がさらに表示されます。

敔瑳䐠捯浵湥൴촊﷽﷽����˿於潁

私たちが抱えている問題は、バイト配列に値を格納する方法、またはおそらくバイト配列から LPTSTR 変数にデータをコピーするときに関連していると思います。私が間違っていることを説明したり、正しい方向に向けるために何か助けていただければ幸いです。

4

1 に答える 1

10

まず、テキスト データとそれがどのように表現されるかについて学ぶ必要があります。そこから始めるための参照は、すべてのソフトウェア開発者が絶対に、積極的にUnicodeと文字セットについて知る必要がある絶対的な最小値です(言い訳はありません!)

bytecharorの typedef か何かですunsigned char。そのため、バイト配列はchar文字列に何らかのエンコーディングを使用しています。それが何であれ、実際にそのエンコーディングから Windows の UTF-16 に変換する必要がありますwchar_t。Windows でこのような変換を行うために推奨される一般的な方法を次に示します。

int output_size = MultiByteToWideChar(CP_ACP,0,value,-1,NULL,0);
assert(0<output_size);
wchar_t *converted_buf = new wchar_t[output_size];
int size = MultiByteToWideChar(CP_ACP,0,value,-1,converted_buf,output_size);
assert(output_size==size);

関数を 2 回呼び出します。1MultiByteToWideChar()回目は、変換の結果を保持するために必要なバッファーの大きさを把握するためであり、2 回目は、実際の変換を行うために、割り当てたバッファーを渡します。

CP_ACPソースのエンコーディングを指定します。その値が実際にどうあるべきかを理解するには、API ドキュメントを確認する必要があります。CP_ACP「codepage: Ansi codepage」の略で、「「非 Unicode」プログラム用のエンコーディング セット」という Microsoft の言い方です。API は、CP_UTF8(期待できる) または 1252 など、別のものを使用している可能性があります。

ここで MultiByteToWideChar の残りのドキュメントを表示して、他の引数を把握できます。


メモリの割り当てを開始する行を実行すると、画像変数が不要な Unicode 文字でいっぱいになります。

あなたがあなたに与えられたメモリを呼び出すとmalloc()、初期化されておらず、ゴミが含まれているだけです。初期化する前に表示される値は重要ではなく、そのデータを使用しないでください。重要な唯一のデータは、バッファを埋めるものです。上記のMultiByteToWideChar()コードは、文字列を自動的に null で終了するので、未使用のバッファー スペースにゴミが表示されることはありません (また、バッファーの割り当てに使用する方法では余分なスペースが残りません)。


上記のコードは、実際にはあまり良い C++ スタイルではありません。これは、Win32 が提供する C スタイルの API の典型的な使い方です。私が変換を行うことを好む方法 (強制された場合) は、次のようなものです。

std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t> convert; // converter object saved somewhere

std::wstring output = convert.from_bytes(value);

char(使用されているエンコーディングが UTF-8 であると仮定しますcodecvt。他のエンコーディングには別のファセットを使用する必要があります。)

于 2012-12-14T23:01:21.880 に答える