有哪些代码片段用于检测一大块UTF-8文本的语言?我基本上需要过滤大量的中文和阿拉伯文垃圾邮件。有一个PECL扩展,但我想纯粹在PHP代码中这样做。我想我需要使用unicode版本的ord()循环一个Unicode字符串,然后为不同的语言创建某种范围表。
答案 0 :(得分:4)
通过Google's language detection管道您的文字。你可以通过AJAX来做到这一点。这是documentation/developer's guide。例如:
<html>
<head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("language", "1");
function initialize() {
var text = document.getElementById("text").innerHTML;
google.language.detect(text, function(result) {
if (!result.error && result.language) {
google.language.translate(text, result.language, "en",
function(result) {
var translated = document.getElementById("translation");
if (result.translation) {
translated.innerHTML = result.translation;
}
});
}
});
}
google.setOnLoadCallback(initialize);
</script>
</head>
<body>
<div id="text">你好,很高興見到你。</div>
<div id="translation"></div>
</body>
</html>
答案 1 :(得分:2)
您可以将UTF-8字符串转换为其Unicode代码点,并查找“可疑范围”。
function utf8ToUnicode($utf8)
{
if (!is_string($utf8)) {
return false;
}
$unicode = array();
$mbbytes = array();
$mblength = 1;
$strlen = strlen($utf8);
for ($i = 0; $i < $strlen; $i++) {
$byte = ord($utf8{$i});
if ($byte < 128) {
$unicode[] = $byte;
} else {
if (count($mbbytes) == 0) {
$mblength = ($byte < 224) ? 2 : 3;
}
$mbbytes[] = $byte;
if (count($mbbytes) == $mblength) {
if ($mblength == 3) {
$unicode[] = ($mbbytes[0] & 15) * 4096 + ($mbbytes[1] & 63) * 64 + ($mbbytes[2] & 63);
} else {
$unicode[] = ($mbbytes[0] & 31) * 64 + ($mbbytes[1] & 63);
}
$mbbytes = array();
$mblength = 1;
}
}
}
return $unicode;
}
答案 2 :(得分:0)
最简单的方法可能是使用不同语言的常用单词词典,然后测试每种语言的正面匹配数量。然而,这是一项相当昂贵的(计算方面的)任务。
答案 3 :(得分:0)
阿拉伯字符主要位于 Unicode范围 0600–06FF中。 Unicode对阿拉伯语有一些补充等。例如,code range 0750–077F主要包含主要用于某些非洲语言的阿拉伯字符。 code range 08A0–08FF涵盖了非洲语言,欧洲和中亚的更多信件 语言,巴基斯坦古兰经标记等。如果您已经涵盖0600-06FF,阿拉伯语FB50–FDFF和FE70–FEFF的另外两个Unicode代码范围可能不太重要。
中文(以及日语和韩语)的字符在不同的Unicode范围内注册(具有多个exntsions)。最重要的是4E00–9FD5。假设您不必担心日语,这对于脚本检测就足够了,但是如果您想检查扩展名,请查看Unicode联盟list of code charts 。
因此,如果您需要仅过滤阿拉伯文和中文脚本,并且不想使用troelskn建议的方法(即使用您要识别的语言的常用字词列表 - 这对于大量语言来说不能很好地扩展),检测输入中字符的代码范围应该足够了。 StackOverflow已经解决了之前关于how to detect Unicode ranges in PHP的问题。