有哪些代码片段可以检测UTF-8文本块的语言?我需要过滤大量中文和阿拉伯文垃圾邮件。虽然有一个PECL扩展可以实现这一点,但我想纯粹使用PHP代码来完成。我想需要用unicode版本的ord()循环遍历Unicode字符串,然后创建不同语言的范围表。
有哪些代码片段可以检测UTF-8文本块的语言?我需要过滤大量中文和阿拉伯文垃圾邮件。虽然有一个PECL扩展可以实现这一点,但我想纯粹使用PHP代码来完成。我想需要用unicode版本的ord()循环遍历Unicode字符串,然后创建不同语言的范围表。
通过Google的语言检测对您的文本进行管道传输。您可以通过AJAX实现这一点。这里是文档/开发者指南。例如:
<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>
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;
}
最简单的方法可能是拥有一个包含不同语言常用词汇的字典,然后测试每种语言中有多少个正匹配。但这是一项相当昂贵(计算方面)的任务。
阿拉伯字符主要在Unicode范围0600-06FF内。Unicode还有一些补充等用于阿拉伯语。例如,代码范围0750-077F主要包含一些非洲语言中使用的阿拉伯字符。代码范围08A0-08FF涵盖了一些非洲语言、欧洲和中亚语言、巴基斯坦古兰经标记等的更多字母。如果您已经涵盖了0600-06FF,则另外两个阿拉伯Unicode代码范围FB50-FDFF和FE70-FEFF可能不那么重要。
关于中文(以及日语和韩语)的字符被注册在不同的Unicode范围内(包括几个扩展)。最重要的一个范围是4E00–9FD5。假设你不需要考虑日语,这应该足够用于脚本检测,但如果你想检查扩展范围,请查看Unicode联盟的代码图表列表。
所以,如果你需要仅过滤阿拉伯文和中文脚本,并且不想使用troelskn建议的方法(即使用要识别的语言的常见词汇列表 - 这对于大量语言来说不太可行),检测输入中字符的代码范围应该足够了。StackOverflow已经解决了一个早期问题,关于如何在PHP中检测Unicode范围。