2008-09-26 51 views

回答

5

確實如存在提案: 存在「iconv」函數來處理所有奇怪的轉換,幾乎所有編程語言都可用,並且有一個特殊選項,它嘗試將目標集中丟失的字符與近似值進行轉換。

使用的iconv簡單地轉換您輸入UTF-8字符串位的ASCII。否則,你總是會碰到角落案例:一個8位輸入使用不同的代碼頁和不同的字符集(因此根本不用你的轉換表),忘了映射最後一個愚蠢的重音字符(你映射的所有墳墓/急性口音,卻忘了地圖捷克卡隆或北歐「°」)等

當然,如果你想將解決方案應用於小特定問題(使文件系統文件名友好爲您音樂收藏),查找數組是要走的路線(對於每個代碼數大於128的數組,根據JeeBee的建議映射128以下的近似值,或者由vIceBerg提出的源/目標對取決於哪些替換函數是已經可以用你選擇的語言),因爲它會很快被黑客攻擊並快速檢查缺失的元素。

0

我想你已經把它釘在頭上了。鑑於你的有限領域,轉換數組或散列是你最好的選擇。沒有意義創造任何複雜的嘗試自動做到這一點。

6

我覺得你不行。

我平時做這樣的事情:

AccentString = 'ÀÂÄÉÈÊ[和所有其他]'
ConvertString = 'AAAEEE [和所有其他]'

尋找在AccentString炭和取代它同指數ConvertString

HTH

1

你似乎已經釘它,我認爲。一個128字節長的字節數組,由char & 127索引,包含8位位字符的匹配7位字符。

0

查找數組可能是最簡單快速的方法。這是您可以將ASCII,ASCII轉換爲EBCDIC的一種方式。

1

嗯,爲什麼不只是用iconv更改字符串的編碼呢?

1

這實際上取決於您的源字符串的性質。如果您知道該字符串的編碼,你知道,這是一個8位編碼 - 例如,ISO拉丁語1或類似的 - 那麼一個簡單的靜態數組就足夠了:

static const char xlate[256] = { ..., ['é'] = 'e', ..., ['Ü'] = 'U', ... } 
... 
new_c = xlate[old_c]; 

在另一方面,如果你有一個不同的編碼,或者如果你使用的是UTF-8編碼的字符串,你可能會發現ICU庫中的函數非常有用。

17

大多數語言都有標準的方法來用標準的ASCII替換重音字符,但它取決於語言,而且它通常需要用兩個ASCII字符替換單個重音字符。例如在德國ü成爲你。所以,如果你想正確處理自然語言,它比你想象的要複雜得多。

0

高128個字符沒有標準含義。他們可以根據用戶的語言採取不同的解釋(代碼頁)。

例如,見 PortugueseFrench Canadian

除非你知道的代碼頁,你的「翻譯」將是錯誤的時候。

如果您打算假設某個代碼頁(例如原始IBM代碼頁),那麼轉換數組將會起作用,但對於真正的國際用戶來說,這將是錯誤的。

這就是爲什麼Unicode是優於代碼頁的舊系統。

嚴格地說,ASCII只有7位。

11

是將U給ü真的是你想做些什麼?我不知道其他語言,但在德語中,將成爲Ue,ö將變成oe等。

+2

甚至沒有那麼簡單,如果用在全大寫的單詞中,它將成爲UE – 2013-02-05 16:31:12

+0

還有一些必須使用7位字符集的情況,例如SMTP Content-Transfer-Encoding - en.wikipedia。組織/維基/ MIME#內容傳輸編碼。另外,如果您因SMTP問題查看本文,請查看SMTP客戶端/庫的UUEncoding功能。 – 2015-05-22 04:13:52

1

上有CodeProject看起來很不錯的文章。

而且使用代碼頁1251轉換採取我的興趣(見其他答案)。

我不喜歡的轉換表,因爲在Unicode字符的數量是很大,你很容易錯過一個。

0

我用這個功能來修復與口音的變量傳遞給皁功能從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) 
26

對於.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