2011-10-25 9 views
1

私が理解できない奇妙なユニコードに関する問題に遭遇しています。ユニコード変換の問題C++

基本的には、コマンドラインから手動で実行すると、さまざまな入力でmbtowcs()を正常に呼び出すコマンドラインアプリケーションがあります(http://www.cplusplus.com/reference/clibrary/cstdlib/mbstowcs /)は文字列を操作し、適切な出力を返します。

このアプリケーションがmonit経由で自動的に実行されるたびに、この関数は正しいバイト数を変換しなくなり、出力は基本的に文字化けし、ユニコードのエラーダイヤモンドに散在します。私は同じ入力についてこれをテストしました。

これは、ロケールやマシン(Ubuntu Server 11.04)の設定に関するものと思われます。私はsetlocale(LC_CTYPE、 "")を呼び出しています。私のスタートアップ機能でうまくいきました。

私のコードを正しく動作させるためには、どのシステム設定を変更する必要があるのですか?

更新:

setlocale(LC_CTYPE, "en_US.UTF-8"); 

setlocale(LC_CTYPE, ""); 

を変更するように見えるが、問題を解決している可能性があります。なぜこれが必要なのか、あるいはこれを避けるために私のシステム設定をどのように変更できるのか、誰でも情報を提供できますか?

+0

なぜ最初にsetlocale()を呼び出しますか? UTF-8は、Linux上のすべての文字列のデフォルトエンコーディングとして広く受け入れられています。 –

答えて

0

バイト文字列からwchar_t文字列への変換は、ロケールに依存する必要があります。これは、mbstowcs関数がバイト文字列を入力する文字エンコーディングを知っている必要があり、通常は推測に役立つロケールを使用するためです。

あなたの入力バイトがある場合:

C3 B6 

そして、UTF-8として

00F6 

しかし、ISO-8859-1の文字列として解釈場合のwchar_tシーケンスでその文字列öを解釈した場合öこれは

00C3 00B6 

wchar_tシーケンスは現在、いくつかのバイト列は、特定のencodinのために有効ではありませんあなたのユニコードのエラーダイヤモンドを説明する可能性があります。ロケールを混乱させたくない場合は、代わりにiconvライブラリを使用して見ることができます。 wchar_tタイプは、通常、UTF-32エンコーディング(LEまたはBE)の1つに対応しますが、どのように移植可能かはわかりません。

+0

Linuxでwchar_tを使うのは誰だろう? –

+0

テキスト/文字解析を行う場合に便利です。例えば空白、文字、数字などを検出します。 – Sodved

+0

これは便利です))utf8everywhere.org –