9

wstringをUTF-8エンコーディングに変換したいのですが、Linuxの組み込み関数を使用したいと思います。

Linuxで簡単な呼び出しでUTF-8に変換wstringまたは変換する組み込み関数はありますか?wchar_t*

例:

wstring str = L"file_name.txt";
wstring mode = "a";
fopen([FUNCTION](str), [FUNCTION](mode)); // Simple invoke.
cout << [FUNCTION](str); // Simple invoke.
4

4 に答える 4

15

コンパイラが十分なC++11をサポートしている場合は、次を使用できます。wstring_convert

#include <iostream>
#include <codecvt>
#include <locale>
int main()
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> utf8_conv;
    std::wstring str = L"file_name.txt";
    std::cout << utf8_conv.to_bytes(str) << '\n';
}

Linuxではclang++2.9 / libc ++で、WindowsではVisualStudio2010でテストされています。

于 2011-09-26T22:14:40.190 に答える
8

C ++言語標準には、明示的なエンコーディングの概念はありません。これにwchar_tは、「十分に大きい」タイプである「システムエンコーディング」の不透明な概念のみが含まれています。

不透明なシステムエンコーディングから明示的な外部エンコーディングに変換するには、外部ライブラリを使用する必要があります。選択するライブラリはiconv()(fromWCHAR_TからUTF-8)です。これはPosixの一部であり、多くのプラットフォームで使用できますが、WindowsではWideCharToMultibyte関数がUTF8を生成することが保証されています。

C ++ 11は、新しいUTF8リテラルを。の形式で追加しstd::string s = u8"Hello World: \U0010FFFF";ます。それらはすでにUTF8に含まれていますが、wstring私が説明した方法以外では、不透明なものとインターフェースすることはできません。

もう少し背景については、この質問を参照してください。

于 2011-09-19T10:29:53.270 に答える
1

実際にやりたいことがワイド文字から現在のロケールに変換する場合、wcstombsが必要なことを実行することは非常に妥当です。

そうでない場合は、おそらくICU、ブーストなどに目を向ける必要があります。

于 2011-09-19T10:24:31.727 に答える
-1

確かに、Linuxには組み込みの関数はありません。Linuxという名前はカーネルのみを参照しているため、カーネルとは何の関係もありません。gccに付属しているlibcにそのような機能があるのではないかと真剣に疑っています。

$ man -k utf

この理論をサポートします。しかし、周りにはたくさんの優れたUTF-8ライブラリがあります。私は個人的にそのような変換のためにiconvライブラリをお勧めします。

于 2011-09-19T10:23:53.950 に答える