2011-06-24 10 views
2

私はデータで、FacebookのAPIからXMLファイルを取得しています:UTF8のロケールとは何ですか?

<?xml version="1.0" encoding="UTF-8"?> 
&ltfql_query_response xmlns="api.facebook.com/1.0/"; xmlns:xsi="w3.org/2001/XMLSchema-instance"; list="true"> 
    &ltuser> 
     &ltuid&gt100000022063315</uid> 
     &ltname&gt0xD7 0x99 0xD7 0x95 0xD7 0x97 0xD7 0x90 0xD7 0x99 0x20 0xD7 0x95 0xD7 0x9B 0xD7 0x98 0xD7 0xA8</name> 
    </user> 
</fql_query_response>

私はwchar_t型にUTF-8を翻訳したいです。私はmbstowcsでそうしようとしていますが、明らかに私は設定するロケールを知る必要があります。 Facebookの標準ロケールはありますか?またはutf8のために?

+3

UTF-8には「ロケール」がありません。 [Unicode](http://en.wikipedia.org/wiki/Unicode)(Unicodeコードポイントを1つまたは複数のコードにマップする)の[encoding](http://www.unicode.org/reports/tr17/)です。バイト、多くの場合、送信用) - どの "ロケール"がUnicodeですか? –

+4

".utf8"で終わるロケールは、たとえば、 "en_US.utf8"。 'mbsrtowcs'を実行する前に' setlocale(LC_CTYPE、 "en_US.utf8"); 'と言ってください。または、UTF8からWCHAR_Tに移動するiconvを使用します。 –

+0

wchar_t文字列がUTF-16(またはUTF-32に依存)になるように設定します。 –

答えて

5

としての機能、あなたがiconv、ないmbsrtowcsを使用する必要があります。これのためにあなたは全くsetlocaleを必要としません。

4

@pstノートでは、ここでの用語は少し間違っています。 「ロケール」は、Unicodeが使用できない場合に、どのANSIコードページが国際的なテキストを表すために使用されるかを参照するために使用されることがあります。

読むジョエル・スポルスキの素晴らしい"The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)"

、あなたはUTF-16(またはWindowsでどのような一般的に「ワイド文字」と呼ばれている)にUTF-8でエンコードされたテキストを変換する必要がある場合は、あなたの質問に答えるために使用することができますがユーザーの構成されたロケールに関連付けられていないデータではなく、明示的に指定されたエンコーディングを変換するために、このようなパラメータを持つMultiByteToWideCharCP_UTF8

+0

はい、私はUbuntuで動作していますので、mbstowcsの必要性は – chacham15

+0

+1です。 –

+1

上記のJoelの記事に対する答えの一種である[この記事](http://utf8everywhere.org)にも注意してください。 – Qix

0

こちらはa little discussionです。私はもうこのテーマについて始めました。

基本的に、私が個人的に符号化処理上の2つの別個の経路を区別することになる。

  • 一つはmbstowcsを使用するchar * argv[]から外部のマルチバイト・データを変換し、それを変換することエンコーディングに依存しない、「内部ポータブル」経路であります内部で固定幅のワイド文字列に変換することができます。

  • 固定エンコードのシリアライズ可能なパスは、確定的なエンコードで配信されるデータを処理します。それらの間で翻訳するには、Posix iconvライブラリがこのトリックを行います。

  • iconvの特別なWCHAR_Tエンコーディングを使用すると、2つのパスの間をブリッジすることができます。

あなたが記述状況は、シリアライズ、確定的なデータを読み取るためにあなたを必要とするので、私は(あなたが知っている)UTF8へ変換するのiconvを使用することをお勧めしてwchar_tに変換し、次に、あなたに扱うことができます標準的なCのワイド文字列関数(ただし、実際のエンコーディングについては仮定しません)。コンソールにデータを印刷する必要がある場合は、内部のワイド文字列から、コンソールが望んでいると述べたマルチバイト表現(その詳細はもう気にはなりません)に常にwcstombsすることができます。

+0

それを印刷するには '%ls' ... –

+0

@R .: True; 'printf("%ls ")'は変換を行います。いい視点ね。 –

関連する問題