2015-08-27 171 views
1

在C#中我需要獲取某些字符的ASCII碼。 因此,我將char轉換爲byteint,然後打印結果。ASCII碼字符

String sample="A"; 
int AsciiInt = sample[0]; 
byte AsciiByte = (byte)sample[0]; 

對於ASCII碼爲128或更小的字符,我可以得到正確的答案。
但對於大於128的字符,我得到無關緊要的答案!

我確定所有字符都小於0xFF。

我還測試了System.Text.Encoding並得到了相同的結果。

例如:我得到172對於實際字節值爲129的字符!

其實ASCII字符像ƒ,‡,<,「¥,©,我,³,·,½,»,A
每個字符佔用1個字節,並上升到超過193 我猜有一個Unicode等價物,因爲它們將字符串解釋爲Unicode!
如果SomeOne需要訪問字節的實際值,它是否是有效的已知ASCII字符或不是!

+1

你認爲哪個角色有一個「129實際字節值」? –

+0

(而您是如何獲得這樣的性格?) –

+0

我更新了我的問題,這似乎.NET犯規認識他們!我打開寫入的文件使用VS二進制編輯器這些字符而我看到的實際字節。 – Hamed

回答

4

但對於人物上超過128個,我得到答非所問

不,你不會。您將獲得對應於char的UTF-16代碼單元的底部8位。

現在如果你的文本都是ASCII碼,那就好了 - 因爲無論如何ASCII只能達到127。這聽起來像你實際上在其他一些編碼期待的表示 - 所以你需要找出哪些編碼是,在這一點上,你可以使用:

Encoding encoding = ...; 
byte[] bytes = encoding.GetBytes(sample); 
// Now extract the bytes you want. Note that a character may be represented by more than 
// one byte. 

如果你基本上找的編碼將字節0到255分別視爲U + 0000到U + 00FF,則應使用ISO-8859-1,您可以使用Encoding.GetEncoding(28591)訪問ISO-8859-1。

+0

其實我的工作與所用特殊字體字符的家庭,代表波斯語,每個字符需要1個字節,並上升到超過193 – Hamed

+2

@hamednaseri:那是肯定*不* ASCII,你需要找出哪些編碼你實際使用。 (據我所知,Unicode不包含U + 0000到U + 00FF範圍內的任何波斯語字符,所以我認爲你需要仔細看看這個......可能你的字體實際上只是提供完全不同的Unicode字符的字形...) –

+0

是的它不是ASCII碼,我用ANSI來保存NotePad中的字符(每個字符1字節)。然後我打開字節假設每個字節值是它的ASCII碼!微不足道的錯誤。感謝您的描述。 – Hamed

1

你不能忽略編碼的問題。字節和字符之間沒有固有映射 - 這是由編碼定義的。

如果我使用你的例子131,在我的系統上,這產生â。不過,既然你阿拉伯語系統上明顯的時候,你最有可能的是Windows-1256編碼,這對於131

換句話說產生ƒ,如果你需要使用正確的編碼轉換字符字節和副當反之亦然。在你的情況下,

var sample = "ƒ"; 
var byteValue = Encoding.GetEncoding("windows-1256").GetBytes(sample)[0]; 

它產生131,你似乎期望。最重要的是,這將適用於所有電腦 - 如果你想擁有這個系統區域特定的,Encoding.Default也可以爲你工作。

您的方法似乎適用於128以下字節的唯一原因是在UTF-8中,字符對應於ASCII標準映射。但是,您濫用術語ASCII - 它只是指這些7位字符。你所說的ASCII實際上是一個擴展的8位字符集 - 所有帶有8位集的字符都是與字符集相關的。

我們不再在這個世界上的時候,你可以假設你的應用程序將只與你有相同的語言環境的計算機上運行 - .NET是專爲這一點,這就是爲什麼所有的字符串都是Unicode的。至少,請閱讀http://www.joelonsoftware.com/articles/Unicode.html以瞭解編碼如何工作,並解決您似乎具有的一些嚴重和危險的誤解。

+0

很好的解釋和好的文章,我對Unicode和編碼有幾個誤解。 – Hamed