32

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

'iconv' へのいくつかの参照をググることができましたが、いくつかの理由から、wchar_t UTF-16 を UTF-8 に変換するなどの基本的な変換のサンプルを見つけることができません。

誰でも「クロス」する方法を推奨できます。参照またはサンプル付きのガイドを知っている場合は、非常に感謝します。

ありがとう、ドリーバー

4

9 に答える 9

12

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

Get-Content PATH\temp.txt -Encoding Unicode | Set-Content -Encoding UTF8 PATH2\temp.txt
于 2015-03-11T08:46:14.017 に答える
6

ICUを使いたくない方は

  1. Windows: WideCharToMultiByte
  2. Linux: iconv (Glibc)
于 2010-05-20T02:08:29.263 に答える
5

オープン ソースのICU ライブラリは非常に一般的に使用されています。

于 2010-05-19T18:57:35.653 に答える
5
#include <iconv.h>

wchar_t *src = ...; // or char16_t* on non-Windows platforms
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);
于 2010-05-20T02:03:16.763 に答える
4

私もこの問題に遭遇しました。ブーストロケールライブラリを使用して解決します

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 バッファーを含めることはお勧めしません。

于 2013-12-04T04:37:29.383 に答える
2

ヘッダーのみのライブラリであるutfcppもあります。

于 2012-10-12T17:19:23.353 に答える
0

みんなありがとう、これは私が「クロス」ウィンドウとLinuxの要件を解決する方法です:

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

それはそれについてです。

于 2010-05-20T12:36:44.513 に答える