1

これはシナリオです:

  • char*文字列のデータ型のみを使用できます。wchar_t *
  • 私の MS Visual C++ コンパイラは、UNICODE ではなく MBCS に設定する必要があります。これは、私が持っているサード パーティのソース コードが MBCS を使用しているためです。UNICODE に設定すると、データ型の問題が発生します。
  • 正しく印刷できるように文字列を取得する必要があるプリンターで漢字を印刷しようとしています

コードを正しくするには、この行をどうすればよいですか。char * str = "你好";

おそらく16進シーケンスに変換しますか?はいの場合、どのように?どうもありがとう。

char * str = "你好";
size_t len = strlen(str) + 1;


wchar_t * wstr = new wchar_t[len];
size_t convertedSize  = 0;
mbstowcs_s(&convertedSize, wstr, len, str, _TRUNCATE);
cout << convertedSize;

if(! ExtTextOutW(resource->dc, 1,1 , ETO_OPAQUE, NULL, wstr ,  convertedSize, NULL))
{
  return 0;
}

更新:質問を別の方法で言いましょう

私はこれを持っています.char * strにはUTF-8コードユニットのシーケンスが含まれています.2つの漢字你好の場合、ExtTextOutWはまだwstrを正しく実行できません. 理由はありますか?

char * str = "\xE4\xBD\xA0\xE5\xA5\xBD";    
    size_t len = strlen(str) + 1;
    wchar_t * wstr = new wchar_t[len];
    size_t convertedSize  = 0;
    mbstowcs_s(&convertedSize, wstr, len, str, _TRUNCATE);
    if(! ExtTextOutW(resource->dc, 1,1 , ETO_OPAQUE, NULL,  wstr ,  len, NULL))
    {
        return 0;
    }
4

2 に答える 2

2

実際に你好は、一連の Unicode 文字です。正しく表示するには、Unicode 文字セットを使用する必要があります。

唯一の例外は、基本文字セットにこれらの文字の両方を含むマルチバイト文字セットを使用している場合です。とにかくMBCSのコンパイルに行き詰まっていると言っているので、それが解決策かもしれません。機能させるには、システム言語をこの文字を含む言語に設定する必要があります。これを行う正確な方法は、OS のバージョンごとに異なります。彼らはそれを「改善」しようとしていると思います。少なくとも Windows 7 では、これを「非 Unicode プログラムの言語」設定と呼び、「地域と言語」コントロール パネルからアクセスできます。

これらの文字が基本文字セットの一部として提供されるシステム言語がない場合は、基本的に運が悪いです。

データ型を使用する UTF-8 エンコーディング (Windows ではネイティブにサポートされておらず、代わりに Unicode サポートのために UTF-16 を優先) を使用しようとした場合でも、charインターフェイスしている他のアプリケーション/ライブラリが何であれ、で対処することはできません。charWindows アプリケーションは、aが現在の ANSI/MB 文字セットの文字を保持していると想定します。Unicode 文字は にありwchar_t、それを使用できないため、アプリケーションが単に Unicode をサポートしていないことを示しています。(ちなみに、これは壊れていることを意味します。アップグレードの時期です。)

于 2013-04-12T06:31:12.817 に答える