2012-10-15 61 views
1

我用文本編輯器將某個源代碼複製並粘貼到我的程序中。我基本上需要確認源代碼以「int main()」開頭,所以我繼續前進,將行與「int main()」進行比較,但比較總是返回false。在字符串中神祕地加了引號

我決定將字符串剝離成字符,發現奇怪的東西。

enter image description here

所以串線有「INT主要()」,通過裏面這是一個已經被粘貼在文本編輯器的文本。你可能會認爲A和B將具有相同的特點,但他們不這樣做:

enter image description here

我真的不知道哪裏是在一開始就知道引號來源。原始字符串不包含它,調試器不顯示它(否則它會顯示「\」int main()\「」)。這裏發生了什麼?

編輯:我試過line = line.Trim()。那個角色還沒有消失。顯然這是零寬度不間斷空間的一些特殊的unicode字符。我怎樣才能從我的字符串中刪除這個?

+1

在您的文章'line'賦值語句。我認爲它應該是 - 'line =「\」int main()\「」;' – adatapost

+0

@AVD就是這樣,事實並非如此。您在上面看到的調試器工具提示正是在行內傳遞的。 – l46kok

+5

您是否從互聯網複製和粘貼?該Unicode字符代碼(65279)對應於零寬度的空間,這將難以在視覺上辨別。見http://www.fileformat.info/info/unicode/char/feff/index.htm –

回答

0

我已經找到了解決辦法:

private readonly string BYTE_ORDER_MARK_UTF8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble()); 

... 

if (line.StartsWith(BYTE_ORDER_MARK_UTF8)) 
       line = line.Remove(0, BYTE_ORDER_MARK_UTF8.Length); 

那是...的bizzare

-1

在你發佈的代碼中,它好像是line變量以空格字符開始。嘗試line = line.Trim();

編輯:

預期可在MSDN

從.NET Framework 4開始發現string.Trim()方法是不工作的原因,該方法修剪所有的Unicode空白字符(即傳遞給Char.IsWhiteSpace方法時產生真實返回值的字符)。由於此更改,.NET Framework 3.5 SP1及更早版本中的Trim方法刪除了兩個字符,零寬度空間(U + 200B)和零寬度空閒空間(U + FEFF),即Trim方法中的兩個字符。 NET Framework 4和更高版本不會刪除。

(U+FEFF)似乎是在line開頭的字符,因此,爲什麼Trim不處理它。

+0

?不,它不。 – l46kok

+0

不僅不是這樣,即使它是,'b'將包含一個空間,而不是。最重要的是,'a'包含一個空字符串,而不是空格。 – jdotjdot

+0

它看起來像它一樣。 char(65279)是一個空間不是嗎? – Greg

1

您可以設置lineline.Trim();如果沒有看到如何設置line,很難判斷可能會發生什麼。基於BOM字符,

更新:儘量line.Trim(new char[]{'\uFEFF'});假設.NET 4

+0

好的。我會嘗試更新。 – l46kok

2

65279看起來像一個UTF-16 BOM(U + FEFF)的十進制表示,是有可能的是,這樣你正在閱讀的數據到「行」將無法刪除它?

+0

啊,現在我明白它是什麼了。如上所述,我正在讀取已從源代碼複製並粘貼到我的文本編輯器中的字符串,因此我無法更改原始文本。我有從我的字符串中刪除BOM的方法嗎? – l46kok

+0

刪除它的最安全的方法就像'if(line [0] =='\ uFEFF')line = line.Substring(1);' – Eric