web-dev-qa-db-ja.com

CおよびWindowsでUTF-16をUTF-8に変換します

文字列をUTF-16LEからUTF-8に変換する目的で推奨される「クロス」WindowsおよびLinuxの方法があるかどうか疑問に思っていましたか?または、環境ごとに異なる方法を使用する必要がありますか?

私は 'iconv'へのいくつかの参照をグーグルで管理しましたが、基本的な変換のサンプルが見つかりません-wchar_t UTF-16をUTF-8に変換します。

誰もが「クロス」となる方法を推奨できます。参考文献やサンプル付きのガイドを知っているなら、それを高く評価します。

ありがとう、Doori Bar

24
DooriBar

おかげで、これは私が「クロス」ウィンドウとLinuxの要件を解決する方法です:

  1. ダウンロードおよびインストール済み:MinGW、およびMSYS
  2. libiconvソースパッケージをダウンロードしました
  3. libiconvを介してMSYSをコンパイルしました。

それについてです。

0
DooriBar

ICUを使用したくない場合は、

  1. Windows: WideCharToMultiByte
  2. Linux: iconv (Glibc)
6
Alex B

PowerShellでエンコードをUTF-8に変更します。

powershell -Command "Get-Content PATH\temp.txt -Encoding Unicode | Set-Content -Encoding UTF8 PATH2\temp.txt"
6
user4657497

オープンソース ICUライブラリ は非常によく使用されます。

5
Hans Passant

私もこの問題に遭遇しました。 boost locale library を使用して解決します

try
{           
    std::string utf8 = boost::locale::conv::utf_to_utf<char, short>(
                        (short*)wcontent.c_str(), 
                        (short*)(wcontent.c_str() + wcontent.length()));
    content = boost::locale::conv::from_utf(utf8, "ISO-8859-1");
}
catch (boost::locale::conv::conversion_error e)
{
    std::cout << "Fail to convert from UTF-8 to " << toEncoding << "!" << std::endl;
    break;
}

boost :: locale :: conv :: utf_to_utf関数は、UTF-16LEでエンコードされたバッファーからUTF-8に変換しようとします。boost :: locale :: conv :: from_utf関数は、UTF-8でエンコードされたバッファーからANSIへの変換を試み、エンコードが正しいことを確認します(ここでは、Latin-1、ISO-8859- 1)。

もう1つの注意点は、Linuxではstd :: wstringの長さは4バイトですが、Windowsではstd :: wstringの長さは2バイトなので、std :: wstringを使用してUTF-16LEバッファーを含めることはお勧めできません。

5
Daniel King
wchar_t *src = ...;
int srclen = ...;
char *dst = ...;
int dstlen = ...;
iconv_t conv = iconv_open("UTF-8", "UTF-16");
iconv(conv, (char*)&src, &srclen, &dst, &dstlen);
iconv_close(conv);
4
Remy Lebeau

tfcpp もあり、これはヘッダーのみのライブラリです。

2
Kevin Smyth