2017-10-21 108 views
1

我在Sql Server中與收集Arabic_CI_AS數據庫,我需要一些字符串數據與另一個Postgres的數據庫UTF8字符集進行比較。另外我使用C#進行轉換&的比較。這很容易做到,當字符串中包含一個詞(在這種情況下我應該代替「ي」到「ی」),但對長字符串的特殊與「(」 charachter有問題。Arabic_CI_AS爲UTF8在C#

我不能做到這一點!我嘗試了一些建議的解決方案,如:

var enc = Encoding.GetEncoding(1256); 
byte[] encBytes = enc.GetBytes(customer.name); 
customer.name = Encoding.UTF8.GetString(encBytes, 0, encBytes.Length); 

或:

SELECT cast (name as nvarchar) as NewName 
from Customer 

,但他們不工作,誰能幫我


!?輸入和輸出的

例,在右側看到提示:

My input & out put is like this

+0

「他們不工作」太模糊,所以不可能幫助你。你可以給出確切的輸入和輸出樣本([編輯]問題)。 – miroxlav

+0

輸入:(نمايندهاراک)آقايقاسمي輸出:(??????? ??????) ????? –

回答

0

也許這可以幫助你改變你整理動態

SELECT name collate SQL_Latin1_General_CP1_CI_AS 
from Customer 

SELECT name collate Persian_100_CI_AI 
    from Customer 

或 你可以在c#端試試這個

string _Value=string.Empty; 
byte[] enBuff= Encoding.GetEncoding("windows-1256").GetBytes(customer.name); 
customer.name= Encoding.GetEncoding("windows-1252").GetString(enBuff); 

你也可以選擇其他排序規則。 你應該改變很多排序規則和編碼號碼以得到想要的結果。

+0

謝謝,但這會使字符串變得更糟,所有字符都變成'?'字符 –

+0

我嘗試了所有這些,最後的結果是:(äãÇÄäÏåÇÑÇ~)ÞÞÇÞÓÓí –

+0

@zahrakhoobi - 如果你在十六進制編輯器中檢查它們(讓我們只檢查括號中的文本'(نمايندهاراک)'),它們應該是: 28是'('然後是D9 86 D9 85 D8 A7 D9 8A D9 86 D8 AF等等。你能否以十六進制形式驗證你的輸出?這消除了在解釋輸出時可能出現的顯示問題 – miroxlav

0

SQL Server不支持utf-8字符串。如果您必須處理純拉丁文以外的其他字符,則強烈建議您使用NVARCHAR而不是VARCHAR,並使用阿拉伯文對照。

很多人認爲,NVARCHARutf-16VARCHARutf-8。這不是真的!第二個是擴展的ASCII,並且在任何情況下都使用1個字節,而utf-8將用一個以上的字節對一些字符進行編碼。

所以 - 最重要的問題是:爲什麼?

SQL Server可以把你的字符串轉換成NVARCHAR變量,其轉換爲鏈字節和它重新轉換爲原字符串:

DECLARE @str NVARCHAR(MAX)=N'(نماینده اراک)'; 

SELECT @str 
     ,CAST(@str AS VARBINARY(MAX)) 
     ,CAST(CAST(@str AS VARBINARY(MAX)) AS NVARCHAR(MAX)); 

)的問題是 - 很可能! - 你的阿拉伯文字母是從右到左)從左到右。我想將上面的查詢結果粘貼到這個答案中,但沒有設法讓原來的地方關閉) ......你嘗試編輯,刪除,替換,但你得到別的東西...不知何故有趣,但不是一個錯誤編碼的問題,而是一個錯誤的編輯器...

無論如何,SQL-服務器不是你的問題。您必須從SQL-Server中讀取字符串爲NVARCHAR。 C#正在處理unicode字符串,而不是整理的1字節字符串。每次轉換都有機會破壞你的文字。

如果你的目標(或者你告訴我們的提示)不能夠正確顯示的字符串,它可能是完全沒問題的,但編輯是不是...

如果你傳遞這樣一個UTF-8字符串返回到SQL服務器,你會得到一個爛攤子......

唯一的地方,其中UTF-8是有意義的寫入文件或通過小波段傳輸。如果一個文本包含非常多的普通拉丁字符和一些奇怪的字母(如ver,通常是XML,HTML),則可以節省相當多的磁盤空間或帶寬。有了遠東文本,你甚至可以膨脹你的文本。其中一些字符將需要3或甚至4個字節進行編碼。

在你的數據庫和應用程序中,你應該堅持使用unicode。