0

プログラムが使用する2つの文字列の一部の文字に問題があります。

文字列#1は、サードパーティアプリケーションからデータを取得するVBコードを使用して入力されます。文字列#2は、同じサードパーティアプリケーションから同様のデータを取得しますが、C ++ dllを使用して取得し、VBに送信します。

データにはいくつかの奇妙な記号が含まれています。

エンコーディングやさまざまな文字セットについてはよくわかりませんが、できる限り説明するようにします。

例の文字として「Т」を使用します。

「Т」(これは通常の大文字のtではないことに注意してください)これはUnicodeの10進値です1058 http://www.unicodemap.org/details/0x0422/index.html

この文字が実行時に文字列#1に表示されると、「?」として表示されます。これは、VB6が一部のUnicode文字を表示するために行うことであると私は信じています。キャラクターにAscWを使用すると、正しい値の1058が返されます。

文字列をテキストファイルに出力すると、「?」と表示されます。

C ++ DLLの文字列#2の同じ文字は、2文字の「Т」として表示されます。

その文字列をテキストファイルに出力すると、文字は「Т」として正しく表示されます。

テスト目的でテキストファイルに出力するだけでした。エンコードする必要があるのは2つの文字列だけで、実行時に同じように表示されます。

ここで何が起こっているのか考えていますか?奇妙な文字を両方の文字列で同じように表示する方法はありますか?

ありがとう

編集:C ++ dllも複数文字セットであり、BSTR文字列でデータを送信します

C++DLLのコード

allChatはCStringです

BSTR Message;
int len = allChat.GetLength();
Message = SysAllocStringByteLen ((LPCTSTR)allChat,len+1);

メッセージはVBアプリに返され、その後は文字列に何も起こりません。

文字列#1は通常のVB文字列です

4

1 に答える 1

3

キリル文字の「T」が「Т」になる方法から、文字列を UTF8 でエンコードされた文字列として取得します (エンコーディングを切り替えて Notepad++ で確認しました)。VB アプリに送信する前に、Unicode に変換する必要があります。VB アプリは ASCII ではなく Unicode である必要があることに注意してください。

この関数を使用して、UTF8 を std::wstring に変換できます。

std::wstring utf8to16( const char* src )
{
    vector<wchar_t> buffer;
    buffer.resize(MultiByteToWideChar(CP_UTF8, 0, src, -1, 0, 0));
    MultiByteToWideChar(CP_UTF8, 0, src, -1, &buffer[0], buffer.size());
    return &buffer[0];
}
于 2013-01-30T08:41:28.530 に答える