我正在尋找僞代碼或示例代碼來將高位ascii字符(如,擴展ascii 154)轉換爲U(ascii 85)。如何將8位字符轉換爲7位字符? (即Ü到U)
我最初的猜測是,由於只有大約25個ascii字符與7位ascii字符相似,所以必須使用翻譯數組。
讓我知道如果你能想到其他的東西。
我正在尋找僞代碼或示例代碼來將高位ascii字符(如,擴展ascii 154)轉換爲U(ascii 85)。如何將8位字符轉換爲7位字符? (即Ü到U)
我最初的猜測是,由於只有大約25個ascii字符與7位ascii字符相似,所以必須使用翻譯數組。
讓我知道如果你能想到其他的東西。
確實如存在提案: 存在「iconv」函數來處理所有奇怪的轉換,幾乎所有編程語言都可用,並且有一個特殊選項,它嘗試將目標集中丟失的字符與近似值進行轉換。
使用的iconv簡單地轉換您輸入UTF-8字符串位的ASCII。否則,你總是會碰到角落案例:一個8位輸入使用不同的代碼頁和不同的字符集(因此根本不用你的轉換表),忘了映射最後一個愚蠢的重音字符(你映射的所有墳墓/急性口音,卻忘了地圖捷克卡隆或北歐「°」)等
當然,如果你想將解決方案應用於小特定問題(使文件系統文件名友好爲您音樂收藏),查找數組是要走的路線(對於每個代碼數大於128的數組,根據JeeBee的建議映射128以下的近似值,或者由vIceBerg提出的源/目標對取決於哪些替換函數是已經可以用你選擇的語言),因爲它會很快被黑客攻擊並快速檢查缺失的元素。
我想你已經把它釘在頭上了。鑑於你的有限領域,轉換數組或散列是你最好的選擇。沒有意義創造任何複雜的嘗試自動做到這一點。
我覺得你不行。
我平時做這樣的事情:
AccentString = 'ÀÂÄÉÈÊ[和所有其他]'
ConvertString = 'AAAEEE [和所有其他]'
尋找在AccentString炭和取代它同指數ConvertString
HTH
你似乎已經釘它,我認爲。一個128字節長的字節數組,由char & 127索引,包含8位位字符的匹配7位字符。
查找數組可能是最簡單快速的方法。這是您可以將ASCII,ASCII轉換爲EBCDIC的一種方式。
嗯,爲什麼不只是用iconv更改字符串的編碼呢?
這實際上取決於您的源字符串的性質。如果您知道該字符串的編碼,你知道,這是一個8位編碼 - 例如,ISO拉丁語1或類似的 - 那麼一個簡單的靜態數組就足夠了:
static const char xlate[256] = { ..., ['é'] = 'e', ..., ['Ü'] = 'U', ... }
...
new_c = xlate[old_c];
在另一方面,如果你有一個不同的編碼,或者如果你使用的是UTF-8編碼的字符串,你可能會發現ICU庫中的函數非常有用。
大多數語言都有標準的方法來用標準的ASCII替換重音字符,但它取決於語言,而且它通常需要用兩個ASCII字符替換單個重音字符。例如在德國ü成爲你。所以,如果你想正確處理自然語言,它比你想象的要複雜得多。
高128個字符沒有標準含義。他們可以根據用戶的語言採取不同的解釋(代碼頁)。
例如,見 Portuguese 與 French Canadian
除非你知道的代碼頁,你的「翻譯」將是錯誤的時候。
如果您打算假設某個代碼頁(例如原始IBM代碼頁),那麼轉換數組將會起作用,但對於真正的國際用戶來說,這將是錯誤的。
這就是爲什麼Unicode是優於代碼頁的舊系統。
嚴格地說,ASCII只有7位。
是將U給ü真的是你想做些什麼?我不知道其他語言,但在德語中,將成爲Ue,ö將變成oe等。
在代碼頁1251中,字符使用2個字節編碼:一個用於基本字符,另一個用於變體。然後,當你用ASCII編碼時,只保留基本的字符。
public string RemoveDiacritics(string text)
{
return System.Text.Encoding.ASCII.GetString(System.Text.Encoding.GetEncoding(1251).GetBytes(text));
}
來源:http://www.clt-services.com/blog/post/Enlever-les-accents-dans-une-chaine-(proprement).aspx
我用這個功能來修復與口音的變量傳遞給皁功能從VB6:
Function FixAccents(ByVal Valor As String) As String
Dim x As Long
Valor = Replace(Valor, Chr$(38), "&#" & 38 & ";")
For x = 127 To 255
Valor = Replace(Valor, Chr$(x), "&#" & x & ";")
Next
FixAccents = Valor
End Function
和SOAP函數我這樣做(爲變量名)內:
FileName = HttpContext.Current.Server.HtmlDecode(FileName)
嘗試uni2ascii程序。
對於.NET用戶而言,article in CodeProject(感謝GvS's tip)確實比我迄今爲止所見過的其他任何一個都更正確地回答了問題。
但是該文章中的代碼(在解決方案#1中)非常麻煩。下面是一個緊湊的版本:
// Based on http://www.codeproject.com/Articles/13503/Stripping-Accents-from-Latin-Characters-A-Foray-in
private static string LatinToAscii(string inString)
{
var newStringBuilder = new StringBuilder();
newStringBuilder.Append(inString.Normalize(NormalizationForm.FormKD)
.Where(x => x < 128)
.ToArray());
return newStringBuilder.ToString();
}
爲了擴大對答案了一下,這種方法使用String.Normalize其中:
返回一個新字符串,其文本值與此相同的字符串, 但是其二進制表示符在指定的Unicode 規範化表單中。
具體地,在這種情況下,我們使用NormalizationFormFormKD
,在那些相同MSDN文檔如這樣描述的:
FormKD - 表示一個Unicode字符串是使用完全兼容分解歸一化。
有關Unicode範式的更多信息,請參閱Unicode Annex #15。
甚至沒有那麼簡單,如果用在全大寫的單詞中,它將成爲UE – 2013-02-05 16:31:12
還有一些必須使用7位字符集的情況,例如SMTP Content-Transfer-Encoding - en.wikipedia。組織/維基/ MIME#內容傳輸編碼。另外,如果您因SMTP問題查看本文,請查看SMTP客戶端/庫的UUEncoding功能。 – 2015-05-22 04:13:52