2011-10-03 66 views
5

我試圖替換從Excel電子表格中檢索到的字符串中的一些不受歡迎的字符。原因在於我們的Oracle數據庫使用的是WE8ISO8859P1字符集,該字符集沒有定義Excel在您的文本中「幫助」插入的幾個字符(捲曲引號,em和破折號等)。由於我無法控制數據庫或如何創建Excel電子表格我需要用別的東西替換字符。替換從Excel讀取的字符串中的特定Unicode字符

我檢索單元格的內容轉換成字符串這樣的:

string s = xlRange.get_Range("A1", Missing.Value).Value2.ToString().Trim(); 

查看在Visual Studio中的文本Visualiser的字符串顯示文本是完整和正確檢索。接下來,我嘗試和更換不良分子(在這種情況下,右手卷曲報價符號)中的一個:

s = Regex.Replace(s, "\u0094", "\u0022"); 

但不起任何作用(文字Visualiser的表明它仍然在那裏)。爲了驗證我想替換的字符實際上在那裏,我嘗試過:

bool a = s.Contains("\u0094"); 

但它返回false。但是:

bool b = s.Contains("」"); 

返回true。

我在.NET中對字符串的理解是,它們使用UTF-16編碼,而Excel可能使用ANSI。那麼這是否意味着我需要更改文本的編碼,因爲它出自Excel?或者我在這裏做錯了什麼?任何建議將不勝感激。我已經閱讀並重新閱讀了所有關於Unicode和編碼的文章,但我仍然不明智。

回答

4

.Net中的字符串是UTF-16

你做得對;也許你的十六進制數學是不正確的。 你測試的字符不是"\u0094"(不確定這是你的意思)。以下爲我工作:

((int)"」"[0]).ToString("X")返回"201D"

"」" == "\u201D"返回true

"\u0094" == ""(右手邊是空字符串)返回false

很多UTF-16字符會顯得如由文本可視化器創建的空字符串,但它們可以是不可顯示的字符或代理的一部分(即某些字符可能需要鍵入"\UXXXXXXXX",而其他的可以是ca n用(四位數字)"\uXXXX"。)。我對這個領域的知識非常有限。

參考 - 在Jon Skeet的文章:

+0

是的,你說得很對,我的十六進制值是離開的。原來我使用WIN1252字符集的代碼點而不是UTF-16。有一天,我會理解所有這些(它將被難以理解的複雜性所取代)。感謝你的回答。 –

2

您可以使用NVARCHAR和NTEXT而不是VARCHAR和TEXT對於需要適應這些字符列。 這樣你就不必轉換整個數據庫,而且你是未來的證明,因爲列將是Unicode。

+0

是的,這將是理想的,但遺憾的是我無法控制數據庫。 –

+0

@SidHolland請幫忙嗎? :) http://stackoverflow.com/questions/36393449/special-characters-in-oracle-nclob –