2011-04-27 130 views
12

我有一個asp.net c#頁面,並試圖讀取具有以下字符的文件'並將其轉換爲'。 (從傾斜的撇號到撇號)。閱讀一個Unicode字符的文件

FileInfo fileinfo = new FileInfo(FileLocation); 
string content = File.ReadAllText(fileinfo.FullName); 

//strip out bad characters 
content = content.Replace("’", "'"); 

這不工作,它改變了傾斜撇號到?分數。

+0

有什麼問題? – BrokenGlass 2011-04-27 00:49:01

+0

你說它把傾斜的那個改成了「?」。這意味着您的替換函數的第一個參數是正確的,但第二個參數是錯誤的。它可能是一個Unicode字符,*看起來像單引號,但實際上不是單引號。在沒有Unicode字體的顯示中,或者在打印到屏幕時,無法識別的Unicode字符顯示爲「?」。 – 2011-04-27 02:08:25

+0

檢查第二個參數是否是正確的字符。您可能無意中打開了一個亞洲IME或其他東西,然後鍵入一個亞洲引號字符(即Unicode),該字符在屏幕上看起來就像一個簡單的引號。有時很難區分差異。 – 2011-04-27 02:09:33

回答

1
// This should replace smart single quotes with a straight single quote 

Regex.Replace(content, @"(\u2018|\u2019)", "'"); 

//However the better approach seems to be to read the page with the proper encoding and leave the quotes alone 
var sreader= new StreamReader(fileInfo.Create(), Encoding.GetEncoding(1252)); 
0

如果您使用字符串(大寫)而不是字符串,它應該能夠處理任何你扔在它的Unicode。先試試看看是否有效。

+3

一個是另一個的別名,這不會改變任何東西。 – BrokenGlass 2011-04-27 01:59:11

+0

你是對的!那麼我會假設引號是不是2018/9,也許依賴於語言環境。將其轉換爲int或short來獲取Unicode值,並將\ u + thatNumber替換爲之前發佈的內容。 – kappasims 2011-04-27 02:06:30

15

我懷疑問題不在於替換,而在於讀取文件本身。當我嘗試這種方式(使用Word和複製粘貼)時,我得到了和你一樣的結果,但是檢查content表明.Net框架認爲該字符是Unicode字符65533,即「WTF?」。字符之前字符串替換。您可以通過在Visual Studio調試器,它應該顯示的字符代碼檢查相關字符檢查這個自己:

content[0]; // 65533 '�' 

之所以更換不工作很簡單 - content不含字符串你給它:

content.IndexOf("’"); // -1 

至於爲什麼文件讀取工作不正常 - 讀取文件時,你可能使用了錯誤的編碼。 (如果沒有指定編碼,那麼.Net框架會嘗試爲你確定正確的編碼,但是沒有100%可靠的方法來做到這一點,所以經常會出錯)。你需要精確編碼依賴於文件本身,但在我的情況下,編碼使用是Extended ASCII,所以讀我只需要指定正確的編碼文件:

string content = File.ReadAllText(fileinfo.FullName, Encoding.GetEncoding("iso-8859-1")); 

(見this question)。

您還需要確保在替換字符串中指定了正確的字符 - 在代碼中使用「奇數」字符時,可能會發現通過其字符代碼指定字符更可靠,而不是字符串文字(這可能會導致問題,如果源文件的變化的編碼),例如下列爲我工作:

content = content.Replace("\u0092", "'"); 
+2

而不是'(char)146',''\ u0092''可能更具可讀性,因爲它匹配字符代碼圖表。 – 2011-04-27 04:16:20

+0

@Jeffrey謝謝 - 我已經更新了我的答案。 – Justin 2011-04-27 04:21:42

+0

=='(char)146'的原因是因爲'\ u'表示法使用十六進制,'0x92 == 146' – Justin 2011-04-27 04:27:28

1

我的選擇是該文件中Windows-1252編碼。這與差不多與ISO 8859-1相同。區別在於Windows-1252使用「可顯示的字符,而不是控制字符在0x80到0x9F範圍內」。 (這是傾斜的撇號所在的位置,即0x92)

//Specify Windows-1252 here 
string content = File.ReadAllText(fileinfo.FullName, Encoding.GetEncoding(1252)); 
//Your replace code will then work as is 
content = content.Replace("’", "'"); 
+0

Encoding.GetEncoding(「Windows-1252」) – Daniel 2016-08-25 07:01:44