2012-02-10 7 views
1

コメントシステムはエンジンに組み込まれています。これにより、プログラマーはツールのヒントやヘルプのためにGUIフロントエンドで使用される様々なエクスポーズされた変数/オブジェクトにコメントを付けることができます。C++でのUnicode文字の扱い

最近、特定のツールチップがクラッシュを開始し、時間を無駄にした後、私はそれを文字:まで追跡しました。間違いがない限り、Unicode文字でASCIIでは利用できません。

this answerを考慮して、私はwstringとすると問題を解決すると仮定しました。大きなプロジェクトを変更する前に、wstringが問題を解決するかどうかを確認するテストプロジェクトを作成しました。プロジェクトはクラッシュしませんが、その動作はwstringの場合とは異なります。

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string someString = "successive attack that DOESN’T result"; 
    wstring someWString = L"successive attack that DOESN’T result"; 

    cout << someString << endl; 
    wcout << someWString << endl; 

    return 0; 
} 

//Console Output// 
successive attack that DOESNÆT result 
successive attack that DOESNPress any key to continue . . . 

私はかなりの時間前this articleを読んで、私は文字セットに関連する問題を理解すると思ったが、それは明らかにそうではありません。私は、この問題の解決策と、何が起こっているのか、またこれに近い将来どのように問題を回避するのかについての良い説明に感謝します。

+0

でエンコードされるように変換します。エンコードは何ですか? –

+2

IIRCコンソールでコードページ以外の文字はうまくサポートされません。あなたのツールのヒントは機能しますか? – Rup

+0

@NiklasB .:どのように確認するのか分かりません。上記の例では、Visual Studio 2008を使用して新しいプロジェクトとソースファイルを作成しています。私はソースファイル自体のエンコーディングをどうやってチェックするのか分かりません...?プロジェクトのプロパティでは、出力に差異のない 'Use Multi-byte Character Set'と' Use Unicode Character Set'の両方を試しました。 – Samaursa

答えて

4

Visual Studioを使用しているので、私はあなたがWindowsを使用していると仮定します。 Windowsコンソールはユニコードをサポートしていません。これは、OEM char setを使用します。 CharToOemW/OemToCharWを使用して2つの間で変換することができます。明らかに、すべてのユニコード文字を表すことはできません。

Windowsでは、システムAPIにUTF16が使用されています。あなたのツールチップがWindows APIを使用している場合は、おそらくあなたが使用したいと思うwstringです。ただし、代わりにUTF8を使用して、これをUTF16に変換してからWindows APIを呼び出すことができます。この変換は、MultiByteToWideChar/WideCharToMultiByteを使用して実行できます。あなたがUnicode文字を扱っているので、あなたは、プロジェクトのプロパティで設定し使用Unicode文字にを設定文字を設定した場合

+0

固定ビルドを取得するために行うことができる一時的な修正はありますか(たとえば、直ちにUnicode文字を無視するなど)?すべての文字列を 'wstring'に変換し始めます(かなり時間がかかります)。 – Samaursa

+0

値が127より大きいすべての文字をスキップすると、ASCII文字のみが取得されます。 – rasmus

+1

UTF8の利点は、引き続き通常の文字列を使用できることです。つまり、すべての文字列をwstringに変換する必要はありません。その代わりに、Unicode(UTF16)Windows APIを呼び出すときに変換する必要があります。 – rasmus

1

は、それが適切であろう。

もう1つの考えられる問題は、ソースファイルのエンコードです。 Unicode文字を扱うときのベストプラクティスは、ソースファイルをUTF-8にエンコードすることです。特に、このような文字列リテラルを定義するファイルです。 BOMなしのUTF-8は、Visual Studioではファイル内容を正しく解釈できるように、BOMが必要なため、面倒です。あなたのファイルを変換(私はメモ帳++このためを使用)と、彼らはUTF-8たぶん、ソースファイル自体が適切にエンコードされていない

+0

私はNPP(UTF-8またはUCS-2として保存)で同じことを試してみましたが、VSを使わずに生の 'cl'を使っていましたが役に立ちません。問題は、コンソールが出力を理解していないということです。 –

+0

私の経験では、プログラムがUnicode文字セットを使用し、文字列リテラルを正しく表示しない場合は、ソースファイルのエンコーディングが悪い可能性が高いためです。 – LihO

+0

しかし、正直言って私はコンソールで試していません。 – LihO

関連する問題