2012-07-11 82 views
0

我正在使用PostgreSQL爲C#桌面應用程序供電。當我使用pgAdmin的查詢分析器更新以特殊字符(如版權商標)文本列它的工作原理pefectly:c#中的UTF8字符串變量#

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

當我使用這個相同的查詢從我的C#應用​​程序,它拋出一個錯誤:

invalid byte sequence for encoding

在研究了這個問題後,我知道.NET字符串使用UTF-16 Unicode編碼。

考慮:

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編碼的字符串?是否有其他方法來處理這種情況?

+0

可能是愚蠢的問題給你。但爲什麼不只是使用System.Text.Encoding.GetString(byte []) – HatSoft 2012-07-11 13:50:29

+0

正如我解釋的encoder.getstring不工作。順便說一下,沒有這樣的函數可用system.text.encoding.getstring。 – Esen 2012-07-11 13:51:24

+0

不,我建議你使用System.Text.Encoding.GetString不是System.Text.Encoding.UTF8.GetString – HatSoft 2012-07-11 13:52:55

回答

5

按照從單項目PostgreSQL他們認爲這個頁面,如果你有UTF8字符串錯誤,你可以設置編碼的連接字符串中的Unicode(如果你使用的是Npgsql的驅動程序):

Encoding: Encoding to be used. Possible values: ASCII(default) and UNICODE. Use UNICODE if you are getting problems with UTF-8 values: Encoding=UNICODE

我一直在尋找正式的Npgsql文檔,並沒有提到。 NpgsqlConnection.ConnectionString

+0

爲什麼他們會使用ASCII作爲默認-_- – CodesInChaos 2012-07-11 14:18:41

+0

感謝彼得,這似乎將工作。我會檢查並接受它作爲答案,如果它確實 – Esen 2012-07-11 14:19:03

+0

@Esen嗯,我從來沒有使用postgresql,所以我不知道這是否真的能解決你的問題 - 但它似乎確實是合理的。 – 2012-07-11 14:22:47

-1

我認爲它可能不是由utf-8或16引起的,它可能是由於特殊字符引起的,你可以用實體字符替換char,如'& amp';

+0

我縮小了這個問題。此查詢在查詢分析器中工作,而不是通過代碼。你能解釋一下嗎?更新table1設置column1 ='©'其中column2 = 1 – Esen 2012-07-11 14:11:33

-1

只要把你的ConnectionString就結束了「......;統一=真正的」

+0

我已經想出了答案,在Peter M的回答中評論道。你爲什麼再次複製。 – Esen 2014-01-27 16:14:05