2

Stroustrupの付録D(ロケールとCodecvtに特に注意)を読みました。Stroustrupは、優れたcodecvtとwidenの例(IMHO)を提供していません。私は喜びなしでインターネットからものをノブターンしようとしてきました。私はまた、文字列ストリームを吹き込むことを試みましたが、成功しませんでした。

誰かがUTF-8からUTF-16(またはUTF-32)エンコーディングに移行するためのコードを表示(および説明)できるでしょうか?注:入出力文字列のサイズは事前にわからないため、ソリューションではとを使用する必要があると思いreserveますback_inserter。使用しないでくださいout.resize(in.length()*2)

終了したら、コードが実際に機能するのは素晴らしいことです(壊れたコードがどれだけあるかは驚くべきことです)。次の「往復」を確認してください。以下のバイトは、UTF-8およびUTF- {16|32}の「bone」の漢字です。

const std::string n("\xe9\xaa\xa8");
const std::wstring w = L"\u9aa8";

基本的な質問をお詫びします。Windowsでは、Win32 APIを使用していますが、エンコーディング間を移動するときにこれらの問題は発生しません。

4

2 に答える 2

4

UTF8-CPPを使用するだけです:

std::wstring conversion; 
utf8::utf8to16(utf8_str.begin(), utf8_str.end() , back_inserter(conversion));

警告:これは、wchar_tの長さが2バイト(ウィンドウ)の場合にのみ機能します。

ポータブルソリューションの場合、次のことができます。

std::vector<unsigned short> utf16line; // uint16_t if you can
utf8::utf8to16(utf8_line.begin(), utf8_line.end(), back_inserter(utf16line));

しかし、その後、文字列のサポートが失われます。うまくいけば、char16_tをすぐに取得できます。

于 2011-09-22T00:57:45.593 に答える
2

彼が雑草を吸っていたことはかなり明白なようです。コードページの変換については、iconvをご覧ください。

于 2011-09-21T22:48:38.787 に答える