0

PostgreSQLを使用してC#デスクトップアプリケーションを強化しています。PgAdminクエリアナライザを使用してテキスト列を特殊文字(著作権商標など)で更新すると、完全に機能します。

update table1 set column1='value with special character ©' where column2=1

C#アプリケーションからこれと同じクエリを使用すると、エラーがスローされます。

エンコーディングに無効なバイトシーケンス

この問題を調査した結果、.NET文字列がUTF-16Unicodeエンコーディングを使用していることがわかりました。

検討:

string sourcetext = "value with special character ©";
// Convert a string to utf-8 bytes.
byte[] utf8Bytes = System.Text.Encoding.UTF8.GetBytes(sourcetext);

// Convert utf-8 bytes to a string. 
string desttext = System.Text.Encoding.UTF8.GetString(utf8Bytes);

ここでの問題は、sourcetextdesttextがUTF-16文字列としてエンコードされていることです。合格desttextしても、例外が発生します。

私も成功せずに次のことを試しました:

Encoder.GetString, BitConverter.GetString

編集:私もこれを試しましたが、役に立ちません:

unsafe
{
  String utfeightstring = null;
  string sourcetext = "value with special character ©";
  Console.WriteLine(sourcetext);
  // Convert a string to utf-8 bytes. 
  sbyte[] utf8Chars = (sbyte[]) (Array) System.Text.Encoding.UTF8.GetBytes(sourcetext); 
  UTF8Encoding encoding = new UTF8Encoding(true, true);

  // Instruct the Garbage Collector not to move the memory
  fixed (sbyte* pUtf8Chars = utf8Chars)
  {
    utfeightstring = new String(pUtf8Chars, 0, utf8Chars.Length, encoding);
  }
  Console.WriteLine("The UTF8 String is " + utfeightstring); 
}

.NETにUTF-8でエンコードされた文字列の格納をサポートするデータ型はありますか?この状況を処理する別の方法はありますか?

4

3 に答える 3

5

モノラルプロジェクトPostgreSQLのこのページによると、UTF8文字列でエラーが発生した場合は、接続文字列でエンコードをユニコードに設定できます(Npgsqlドライバーを使用している場合)。

エンコーディング:使用するエンコーディング。可能な値:ASCII(デフォルト)およびUNICODE。UTF-8値で問題が発生した場合は、UNICODEを使用してください:Encoding = UNICODE

そして、私は公式のNpgsqlドキュメントを調べていましたが、言及されていません。 NpgsqlConnection.ConnectionString

于 2012-07-11T14:14:56.447 に答える
-1

utf-8または16が原因ではない可能性があると思います。特殊文字が原因である可能性があります。この文字は、「&amp」のようなエンティティ文字に置き換えることができます。

于 2012-07-11T14:08:00.193 に答える
-1

ConnectionStringを最後に「......;Unicode=true」と入力するだけです。

于 2014-01-21T22:16:51.143 に答える