したがって、文字列の場合
• 32 から 127 までのコードを持つ Char のみがあり、AnsiString として受け入れることができます。簡単に実装できます
はい。ただし、128 ~ 255 の文字値 (別名 ANSI/MBCS 文字) も格納してAnsiString
視覚的に表示できますが、それらの値が属する元の文字セットを知る必要があります。D2009+ の場合、値を に格納し、関数をRawByteString
使用して適切なコードページを文字列に関連付けることができます。SetCodePage()
そうすれば、コード内で文字列を渡すときに文字が正しく解釈されます。Unicode 形式以外の非 ASCII 文字を気にしない場合は、これを無視できます。
•そうでない場合は、Utf8String にフォーマットがあることを知っているので、それを Utf8String に変換しようとします。有効な utf8 文字列かどうかを判断できます。だから私は、はい、それはutf8stringである可能性があることを教えてくれるある種の関数が必要です。
データが有効な UTF-8 文字列かどうかを確認するには、Win32 APIWindows.MultiByteToWideChar()
関数または Embarcadero のSystem.LocaleCharsToUnicode()
関数 (XE 以降のみ) を使用できます。CP_UTF8
(65001) コードページ、MB_ERR_INVALID_CHARS
フラグ、およびnil
出力バッファーを指定します。データが有効な UTF-8 文字列の場合、関数は、実際にデコードされた場合にデータが生成できる UTF-16 文字の数を返します。それ以外の場合、関数はERROR_NO_UNICODE_TRANSLATION
エラー コードで失敗します。
別のオプション (D2009 以降のみ) はGetCharCount()
、クラスのメソッドを使用しSysUtils.TEncoding.UTF8
て同じ数の UTF-16 文字を計算することです。
•それでもそうでない場合は、ワイドストリングとして解釈したいと思います。これは、私が知っているように、フォーマットがないため、最も難しい部分です。
はい、もちろんそうです - UTF-16 は、UTF-8 と同じくらい定義された形式です (実際、UTF-16 には 2 つのフレーバー、リトル エンディアンとビッグ エンディアンがあります)。
データが有効な UTF-16 (リトル エンディアンのみ) 文字列かどうかを確認するには、Win32 APIWindows.WideCharToMultiByte()
関数または Embarcadero のSystem.UnicodeToLocaleChars()
関数 (XE 以降のみ) を使用できます。CP_UTF8
(65001) コードページ、WC_ERR_INVALID_CHARS
フラグ、およびnil
出力バッファーを指定します。データが有効な UTF-16LE 文字列である場合、関数は、実際にエンコードされた場合にデータが生成できる UTF-8 バイト数を返します。それ以外の場合、関数はERROR_NO_UNICODE_TRANSLATION
エラー コードで失敗します。
別のオプション (D2009 以降のみ) は、 (リトルエンディアン) またはクラスのGetByteCount()
メソッドを使用して、同じ数の UTF-8 バイトを計算することです。SysUtils.TEncoding.Unicode
SysUtils.TEncoding.BigEndianUnicode
ここで多くのことを推測する必要があります
いいえ、あなたはしません。UTF-8 と UTF-16 の場合、当て推量は必要ありません。これらは明確に定義された標準化された形式であり、データを失うことなく相互に変換できるように設計されています。