2014-09-24 88 views
0

我有幾個utf8字符串,需要根據所用字符找出語言。用德語,荷蘭語和英語這樣的拉丁字母在語言之間劃分語言並不重要。發生的語言是阿拉伯語,韓語,中文,日語,即具有明確字符集的語言。在大多數情況下,字符串本身都是名稱,可以假定第一個字符足以進行識別。從UTF8獲取語言

+0

你所說的「UTF-8串」呢?在Java中,一個字符串總是表示爲一系列UTF-16代碼單元。 – 2014-09-24 16:37:24

+0

@JonSkeet,Oh Ick!這是真的嗎?我現在已經想過,他們已經將String重新定義爲一系列Unicode _code points_。我猜他們必須保持與16位char數據類型的原始定義的向後兼容性。 – 2014-09-24 16:59:19

+0

@jameslarge:有一些方法可以檢索代碼點或使用代碼點索引,但大部分API都是圍繞UTF-16代碼單元:( – 2014-09-24 17:00:23

回答

0

從理論上講,你可以在Java中的字符串(Unicode的16),德國和中國

你大概可以維持中國字符經常存在的列表,如果存在的話,假設其在中國等

0

這樣做的一種方法是,對於每種語言,保留有序對(c,f)的列表,其中c是來自該語言的唯一字符,並且f是該字符在某個合理語料庫中出現的頻率語言。 (稱這些列表爲「字符直方圖」。)

然後,對於每個文檔,從文檔計算字符直方圖,並將其與所有已知語言進行比較。去任何最接近的匹配。

更好的方法是比較直方圖。

A 實用方式會......我不知道。

1

最簡單的方法可以使用ICU4J庫和方法UScript.getScript(int)

它可以檢測單個字符爲基礎的腳本。對於標點和間距,它將返回UScript.COMMON。對於拉丁文,它返回UScript.LATIN。對於中文和日文漢字,它返回UScript.HAN。對於日文假名,它返回UScript.KATAKANAUScript.HIRAGANA(所以一個HAN不證明文本是中文而不是日文)。

建議您迭代字符串的代碼點,但在大多數情況下,遍歷char就足夠了。

這裏的一些理論:https://en.wikipedia.org/wiki/Script_%28Unicode%29

下面是與所有字符定義的腳本表:http://www.unicode.org/Public/UNIDATA/Scripts.txt