2013-11-14 22 views
7

私は問題がある、私はそうのようなC++ソースコード内の標準char型のUTF-8エンコードされた文字列を使用する必要があります。Visual StudioでUTF-8オクテットを簡単に書く方法はありますか?

char* twochars = "\xe6\x97\xa5\xd1\x88"; 

通常を、私はUTF-8文字を書きたい場合は、私が使用する必要があります上記のオクテットビジュアルスタジオには(私はVS 2013 Ultimateを使用しています)、 "ĘĆ"のように書くだけで、上の例のように各キャラクタを複数のUTF-8オクテットに自動的に変換できますか?または、const wchar_t*を使用して、ワイド文字列をUTF-8でエンコードされた標準文字列に変換できるlibを見つける必要がありますか?

このようなものがない場合は、そのための外部ソフトウェアをお勧めできますか?私は本当にすべてのシンボル/非ラテン文字の文字マップを閲覧する気がしません。

私の英語は申し訳ありません、 ありがとうございます。

+4

'の#pragma execution_character_set( "UTF-8")' VC++ 2010で動作するように使用され、わからない、それはそれは動作しないVC++ 2013 – Jigsore

+0

でまだ使用可能かどう!なぜ私はそれを受け入れることができるように答えとして投稿しないのですか? –

答えて

16

スラッシュundocumentedプラグマディレクティブexecution_character_set("utf-8")を使用することができます。このようにして、char文字列はバイナリにUTF-8として保存されます。ところで、このプラグマはVisual C++コンパイラでのみ使用できます。

#include <iostream> 
#include <cstring> 

#pragma execution_character_set("utf-8") 

using namespace std; 

char *five_chars = "ĄĘĆŻ!"; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    cout << "This is an UTF-8 string: " << five_chars << endl; 
    cout << "...it's 5 characters long" << endl; 
    cout << "...but it's " << strlen(five_chars) << " bytes long" << endl; 
    return 0; 
} 
+1

素晴らしい!これは私が数分間探していたヒントでした。 – fmuecke

+0

ありがとうございます! –

+0

VS2102で認識されません。プラグマはVC++ 2010でサポートされ、VC++ 2012で忘れられ、VC++ 2013で再びサポートされています[リンク](http://stackoverflow.com/questions/23607830/does-vc-have-a-compile-option-like -fexec-charset-in-gcc-set-the-execution) – TinyRacoon

2

現在のバージョンのVC++で直接文字列リテラルをUTF-8に書き込む方法はありません。今後のバージョンにはUTF-8 string literalsが必要です。

ソースファイルの文字列リテラルに非ASCIIテキストを直接貼り付けて、ファイルをUTF-8として保存しようとしました。 16進エディタでソースファイルを見ると、UTF-8として保存されていることが確認されていますが、それでもやりたいことはありません。コンパイル時に、これらのバイトは現在のコードページの文字にマップされるか、警告が表示されます。

文字列リテラルを作成する最もポータブルな方法は、今まで行ってきたように明示的にオクテットを書き込むことです。

ランタイム変換を実行する場合は、いくつかのオプションがあります。

  1. Windows APIにはWideCharToMultiByteがあります。これは、UTF-16としてテキストを取り込み、UTF-8などのマルチバイトエンコーディングに変換できます。
  2. 新しいバージョンのコンパイラとC++ランタイムを使用している場合は、std::codecvtを使用してワイド文字列をUTF-8に変換できます。

これらの手法のいずれかを使用して、変換を行い、文字列リテラルに必要な明示的なオクテットとして出力する小さなユーティリティを書くことができます。出力をコピーしてソースコードに貼り付けることができます。

+0

Jigsoreのコメントから分かるような方法があるようですが、あなたの答えも役に立ちます。ありがとう! –

関連する問題