3

一部のテキスト(例č)をPostgresデータベースに保存しようとしていますが、この値を取得すると、画面にとして表示されます?。なぜそうなるのかわかりません。UTF-8ではサポートされていないがUTF-8でサポートされているキャラクターであるという印象を受けましたが、最初の回答から判断すると、これは誤った仮定です。 。

元の質問(まだ有効な場合があります):

私はUTF-8サロゲートペアについて読みました。これは私が必要とするものを達成する可能性があり、stringinfo オブジェクトTextElementEnumeratorsに関連するいくつかの例を見ましたが、概念の実用的な証明を見つけることができませんでした。

誰かがUTF-16を(おそらくこのサロゲートペアの概念を使用して)postgresデータベースに読み書きする方法の例を提供できますか?ありがとうございました。

更新された質問:č文字が疑問符としてデータベースから返されるのはなぜですか?

NPGSQLを使用して、データベースとVB.Netにアクセスします。

4

3 に答える 3

7

UTF-16には存在するがUTF-8には存在しない文字などはありません。どちらもすべてのUnicodeをエンコードできます。つまり、UTF-8を機能させることができれば、有効なUnicodeテキストを格納できるはずです。

編集:サロゲートペアは、実際にはUTF-8ではなくUTF-16の機能です。これらを使用すると、基本的な多言語平面(BMP)にない文字を2つのUTF-16コードユニットとして表すことができます。基本的に、UTF-16は固定幅エンコーディング(Unicode文字ごとに正確に2バイト)として扱われることがよくありますが、それではBMPをクリーンにエンコードすることしかできません。サロゲートペアは、BMPを超えて範囲を拡張する(かなりハッキーな)方法です。

あなたが表現しようとしているキャラクターがBMPの外にあることは非常に疑わしいので、他の場所で問題を探す必要があると思います。特に、テキストがデータベースに入る前とフェッチした後に、テキストの正確な文字値をダンプする価値があります(たとえば、それぞれcharをにキャストすることによって)。int理想的には、これは短いが完全なコンソールアプリで行います。

于 2011-12-09T16:32:45.897 に答える
1

すべてのUTF-16「文字」をPostgresデータベースに保存するにはどうすればよいですか?

簡単に言うと、PostgreSQLはUTF-8文字セットしかサポートしていないため、これは直接不可能です。

Java、JavaScript、WindowsなどのUTF-16ベースの形式には、UTF-8またはUTF-32で表現されていないハーフサロゲートペアを含めることができます。これらは、Java、JavaScript、VB.Net文字列をサブ文字列化することで簡単に作成できます。これらはUTF-8またはUTF-32で表すことができないため、PostgreSQLのようにUTF-8文字セットのみをサポートするデータベースに格納することはできません。

Windowsパス名には、utf-8( https://github.com/rust-lang/rust/issues/12056 )として読み取ることができない半分の代理ペアが含まれている場合があります。

Java / Android、JavaScript / NodeJS、.Net / wchar_t/Windows言語/プラットフォームにより適合したUTF-16/CESU-8文字セットをサポートするデータベースシステムを使用する必要があります。(SQLServer、Oracle(UTF-8照合)、DB2、Informix、HANA、SQL Anywhere、MaxDBは通常、このような文字セットをサポートしています。

基本多言語面の外側で絵文字がユニコードコードポイントとして表されているため、これらの違いは欧米のユーザーにとってもより適切になることに注意してください。

postgresでは、次のことができます。a)損失を受け入れる、b)データをバイナリデータとして保存する、またはc)エンコードされた表現に変換する(たとえば、JSON rfcはそれらを2つのエスケープ文字としてエンコードして、UTF内で半分のサロゲートを転送できるようにします-損失のない8/ASCIIベースのネットワーク形式(https://www.rfc-editor.org/rfc/rfc4627セクション2.5)。

たとえば、絵文字が基本多言語面の外側にある場合、この問題は西側世界でもより関連性が高くなります。

言語ApplicationServer(Java、Scala、C#/ Windows、JavaScript / NodeJS)の選択と、言語サポートへの投資のレベル(たとえば、書記素境界でのICU文字列分割関数(https://www.unicode)を使用)によって異なります。 org / reports / tr29 /#Grapheme_Cluster_Boundaries)単純な切り捨ての代わりに、問題の関連性は低くなる可能性があります。しかし、今日のエンタープライズシステムと言語の大部分は、単純なサブ文字列操作を使用するソフトウェアを使用してUTF-16キャンプに分類されます。

于 2018-12-15T01:29:51.043 に答える
0

保管/回収の問題について

  1. Postgre dbが実行されている文字セットがUTF-8文字セット(https://www.postgresql.org/docs/9.1/multibyte.html)または文字を表すことができる文字セットであることを確認してください。

  2. データベースへのクライアント接続が適切なコードページ変換を実行するように設定されていることを確認します(VB.Netの場合、これはUTF-16LEからUTF-8またはデータベース文字セットになります。これは通常、接続文字列(文字セット)のパラメーターです) )。

  3. 入力が、Windows-1250バイトシーケンスではなく、VB.netバイトシーケンスの実際のUTF-8/UTF-16であることを確認します。

  4. これが単に出力ツールまたはコンソールの制限ではないことを確認してください(たとえば、Windowsコンソールは通常Unicode文字を表示しませんが、Windows-12xx文字セットを使用します(https://superuser.com/questions/269818/change-を試すことができます)。 default-code-page-of-windows-console-to-utf-8)が、通常はVB.Netデバッガーでバイトシーケンスを検査するのが最適です。

  5. NFKD分解で表されている場合でも、CHAR/VARCHAR列の長さが表現を格納するのに十分であることを確認してください。

あなたが示す書記素には、いくつかの異なるユニコード表現があります。

 U+010D LATIN SMALL LETTER C WITH CARON
 U+0063 LATIN SMALL LETTER c followed by U+030C COMBINING CARON

また、他の文字セット(ISO-8859-2 / Windows-1250(https://en.wikipedia.org/wiki/Windows-1250)またはISO-8859-13 / Windows-1257の0xE8など)の異なる表現。

すべてのUnicode表現は基本多言語面に分類されるため、質問のタイトルに示され、以下で回答されているpostgreのUTF-16サロゲートの問題は、問題とは無関係である可能性があります。

于 2018-12-15T02:23:36.453 に答える