2011-12-04 14 views
4

Windowsは、wchar_tシンボルを16ビット長と定義しています。しかしながら、使用される符号化UTF-16は、いくつかのシンボルが実際には4バイト(32ビット)で符号化され得ることを示す。ワイド文字Windows

wchar_t symbol = ... // Whatever 

かもしれないのみ実際のシンボルの一部を表す:

は、これは私がWindows用のアプリケーションを開発していた場合、次の文があることを意味していますか?


そして、何私はwchar_tは32ビット長である*nix、下の同じことを行う場合には起こるのだろうか?

答えて

7

はい、symbolは、Windows上のサロゲートペアの一部を保持する可能性があります。 On *nixeswchar_tは32ビット長で、Unicode文字セット全体を保持します。 Unicodeコードポイントは文字を表現しないことに注意してください。なぜなら、いくつかの文字は複数のUnicodeコードポイントでエンコードされる可能性があります。したがって、文字数を数えるのは意味がありません。特にこれは、たとえWindows上であっても、UTF-8でエンコードされたnarrow-char文字列以外のものをUnicodeライブラリの外部に使用することは意味がないことを意味します。

詳細はthis old threadをご覧ください。

+0

_code_ _code_ unit_と間違って_codeしました。各文字は1つのコードポイントにのみ関連付けられ、複数のコード単位で表現されます。 – ExpExc

+2

@ExpExc:いいえ、私はしませんでした。キャラクタは、複数の*コードポイント*で表すことができます。もちろん、複数の* codeunit *で表すこともできます。例えば。 'U + 0061 U + U0306'は2つのコードポイント*であり、単一の文字「á」を表します。 CJKスクリプトでは、それはさらに明らかです。 – ybungalobill

+1

また、OSはUTF-8文字列をネイティブに解釈しないため、Windowsでは、OSとの対話の際にUTF-8でエンコードされた文字列を使用しないでください。 Windows APIと対話するときは、UTF-16文字列を使用する必要があります。 UTF-8の使用を主張する場合、文字列をWindows APIに渡す前に、MultiByteToWideChar(CP_UTF8を指定)を呼び出してUTF-8からUTF-16に変換する必要があります。 UTF-8→UTF-16変換を処理するよりも、アプリケーションをUTF-16アプリケーションとして簡単にコーディングする方が簡単です。 Windowsの8ビット文字はUTF-8ではなく、ANSIコードページまたはOEM coeページのいずれかにあります。 –

関連する問題