簡體   English   中英

使用unicode字符讀取文件

[英]Read a file with unicode characters

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

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

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

這不起作用,它將傾斜的撇號變為? 分數。

我懷疑問題不在於替換,而在於讀取文件本身。 當我嘗試這種方式(使用Word和復制粘貼)時,我得到了與您相同的結果,但是檢查content顯示.Net框架認為該字符是Unicode字符65533 ,即“WTF?” 字符串替換的字符。 您可以通過檢查Visual Studio調試器中的相關字符來自行檢查,它應顯示字符代碼:

content[0]; // 65533 '�'

替換不起作用的原因很簡單 - content不包含您給它的字符串:

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

至於為什么文件讀取不正常 - 您在讀取文件時可能使用了錯誤的編碼。 (如果沒有指定編碼,則.Net框架將嘗試為您確定正確的編碼,但是沒有100%可靠的方法來執行此操作,因此通常可能會出錯)。 您需要的確切編碼取決於文件本身,但在我的情況下,使用的編碼是擴展ASCII ,因此要讀取我只需要指定正確編碼的文件:

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

(見這個問題 )。

您還需要確保在替換字符串中指定正確的字符 - 在代碼中使用“奇數”字符時,您可能會發現通過字符代碼指定字符更可靠,而不是字符串文字(這可能會導致如果源文件的編碼發生變化,則會出現問題,例如以下內容對我有用:

content = content.Replace("\u0092", "'");
// 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));

我敢打賭,該文件是在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("’", "'");

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM