2017-03-02 9 views
-1

utf-8ベースのエンコーディングを記述したアプリケーションがあり、これはutf-8 BMP(3バイト)をサポートしています。しかし、サロゲート・ペアをサポートする必要があるという要件があります。C++:utf8で代理文字をサポートする方法

私はutf-8でサロゲート文字がサポートされていないところを読んでいます。本当ですか?

「はい」の場合は、utf-8ではなくutf-16のデフォルトのエンコードを使用するようにアプリケーションを設定する手順は何ですか?

アプリケーション全体がutf-8を念頭に置いて書いてあり、代理文字ではないので、コードスニペットはありません。

utf-8のサロゲートペアのサポートを得るには、コード全体を変更する必要がある項目は何ですか?または、デフォルトのエンコーディングをUTF-16に変更します。

+0

サロゲートペアは、BMPにはなく、UTF-16で保存するには大きすぎるコードポイントをエンコードする方法です。 UTF-8はこれらのコードポイントを格納するだけでよく、UTF-8で2つのコードポイントとしてエンコード(2重エンコード)されたUTF-16サロゲートペアを見たツールであれば、エラーとして扱われます。 –

+0

@ChrisBecke:それは答えであり、コメントではありません。 –

+0

ああ、「UTC-2で保存するには大きすぎる」ことを除いて、UTF-16は16ビットの基本ブロック(およびサロゲートペアが答え)を使用している間に最大1,000,000を超える値を保存する方法です。 –

答えて

0

私たちはutf-8ベースのエンコードを書いたアプリケーションを持っています。これはutf-8のBMP(3バイト)をサポートしています。しかし、サロゲート・ペアをサポートする必要があるという要件があります。

utf-16でエンコードされた文字列をutf-8に変換します。ここにドキュメント:http://www.cplusplus.com/reference/codecvt/codecvt_utf8_utf16/

はいの場合、私のアプリケーションにutf-8ではなくutf-16のデフォルトのエンコードを使用させる手順は何ですか?

間違った質問。内部的にUTF-8を使用してください。

utf-8のサロゲートペアのサポートを取得するには、コード全体を変更する必要がある項目は何ですか?または、デフォルトのエンコーディングをUTF-16に変更します。

上記を参照してください。受信データの場合はUTF-16をUTF-8に変換し、必要な場合はUTF-16発信に変換し直します。

2

私たちはutf-8ベースのエンコーディングを書いたアプリケーションを持っており、これはutf-8 BMP(3バイト)をサポートしています。

なぜユニコードレパートリー全体(4バイト)ではないのですか?なぜ3バイトに制限されるのですか? 3バイトはU + FFFFまでのコードポイントのみをサポートします。 4バイトは、U + 10FFFFまでの追加の1048576コードポイントをサポートします。

ただし、サロゲートペアをサポートする必要があるという要件があります。

サロゲートペアは、UTF-16にのみ適用され、UTF-8またはUCS-2(UTF-16の前身)には適用されません。

私はutf-8でサロゲート文字がサポートされていない場所を読んでいます。本当ですか?サロゲートを符号化するために使用される

コードポイントが物理的にUTF-8でエンコードすることができ、しかしそれらはあるユニコード規格によって予約およびUTF-16エンコードの外使用することは違法です。UTF-8にはサロゲートペアが必要なく、サロゲートコードポイントを含むデコードされたUnicode文字列はすべて誤っているとみなす必要があります。

「はい」の場合は、utf-8ではなくutf-16のデフォルトのエンコードを使用するようにアプリケーションを設定する手順は何ですか?

あなたのプロジェクトの設定方法に関する情報を提供していないので、私たちは、など、あなたが使用しているコンパイラ、

ていることに答えることができないしかし、あなたは切り替える必要はありませんUTF-16へのアプリケーションUTF-8の4バイトエンコーディングをサポートするようにコードを更新するだけで、16ビットデータをUTF-8に変換するときにサロゲートペアをサポートする必要があります。可能な限り最高のコードポイントとしてU + FFFFに制限しないでください。 Unicodeにはそれよりも多くのコードポイントがあります。

あなたのコードは、UTF-8との間でデータを変換するときにのみUCS-2を処理するようです。そのコードをUCS-2の代わりにUTF-16をサポートするように更新すれば、うまくいくはずです。

関連する問題