2017-03-18 15 views
1

私はC言語でプログラミングしていて、すべてのUTF(wchar_tバージョン(mbrtowc関数を使用)に変換するために、すべてのUTF(つまり、 "ru_RU-UTF-8"、 "en_EN-UTF-8" 。一部の地域では有効なwchar_tである限り、特にwchar_tに変換することは重要ではありません。任意の言語/国のUTF-8ロケールはありますか?

ロケールに渡すことができる「UTF-8-whatever」設定はありますか?

私はsetlocale("POSIX")/setlocale("C")の正反対を探しています...、

setlocale(LC_ALL, "ru_RU.UTF-8"); 
stuff = mbrtowc(.....) 

作品、Cコード...

setlocale(LC_ALL, "en_US.UTF-8"); 
stuff = mbrtowc(.....) 

戻り次第、それはキリル文字を打つよう-1をCコードを明確にするために

。私が扱っているものにも日本語の文字などがあるかもしれません。

+0

あなたのためにそれを扱うライブラリを 'iconv'のように使います。私はそのような "ロケール*"はないと思う。 –

+0

私は間違いなくiconvを調べます、ありがとう。 –

+0

「RU-UTF-8」などとは何ですか?また、 'wchar_t'はUnicodeのすべてのエンコーディングを保証するものではありません。プラットフォームによって異なります。 – Olaf

答えて

3

Cのロケールとwchar関数の問題は、それらがプラットフォームに非常に依存していることです。それは価値があるため、Linux上でen_US.UTF-8ロケール(Ubuntu 16.04)を使用してキリル文字UTF-8をwcharsに変換することは問題ありません。次のコード

#include <locale.h> 
#include <stdio.h> 
#include <wchar.h> 

int main() { 
    const char in[] = "\xD0\xB1"; 
    wchar_t out; 
    size_t consumed; 

    setlocale(LC_ALL, "en_US.UTF-8"); 
    consumed = mbrtowc(&out, in, sizeof(in) - 1, NULL); 
    if (consumed > 0) { 
     printf("%04x\n", (unsigned)out); 
    } 

    return 0; 
} 

プリント予想通り

0431 

。他のプラットフォームでは、マイルが異なる場合があります。 Windowsのような16ビットのwchar_tのプラットフォームは、特に問題があります。しかし、うらやましいプラットフォームでは、すべてのUnicode文字をUTF-8ロケールでエンコードしてデコードできるので、汎用UTF-8ロケールは必要ありません。

UTF-8で作業したい場合は、iconv、utf8proc、libunistring、またはICUなどのUTF-8変換用のライブラリを検討する必要があります。独自の変換ルーチンを記述することもできます。あまりにも難しくありません。

+0

' 0431'は 'б'のための_Unicode_です; _UTF-8_、つまり16進数の「D0B1」に固執する。 –

関連する問題