本文目录导读:

我来介绍几种在PHP中检测语言/字符编码的方法:
检测字符编码
mb_detect_encoding() - 检测字符串编码
$text = "Hello 世界"; $encoding = mb_detect_encoding($text, ['UTF-8', 'GBK', 'ASCII', 'ISO-8859-1'], true); echo $encoding; // 输出: UTF-8
mb_check_encoding() - 检查是否特定编码
$text = "Hello World";
if (mb_check_encoding($text, 'UTF-8')) {
echo "是UTF-8编码";
}
检测语言
使用第三方库 - Text_LanguageDetect
// 通过Composer安装 // composer require pear/text_languagedetect require_once 'vendor/autoload.php'; $detector = new Text_LanguageDetect(); $text = "This is an English sentence."; $lang = $detector->detect($text); // 返回 ['english' => 0.98] 或直接获取语言名 $langName = $detector->detectSimple($text); echo $langName; // 输出: english
使用Google Cloud Translation API
// 需要安装google/cloud-translate
require_once 'vendor/autoload.php';
use Google\Cloud\Translate\V2\TranslateClient;
$translate = new TranslateClient();
$result = $translate->detectLanguage('Bonjour le monde');
echo $result['languageCode']; // 输出: fr
简单的英文和中文字符检测
function detectChinese($str) {
return preg_match('/[\x{4e00}-\x{9fff}]/u', $str) > 0;
}
function detectEnglish($str) {
return preg_match('/^[a-zA-Z\s.,!?\'"-]+$/', $str) > 0;
}
function detectLanguageSimple($text) {
if (preg_match('/[\x{4e00}-\x{9fff}]/u', $text)) {
return '中文';
}
// 检测日文假名
if (preg_match('/[\x{3040}-\x{30ff}]/u', $text)) {
return '日文';
}
// 检测韩文
if (preg_match('/[\x{ac00}-\x{d7af}]/u', $text)) {
return '韩文';
}
// 检测西里尔字母(俄语等)
if (preg_match('/[\x{0400}-\x{04FF}]/u', $text)) {
return '斯拉夫语系';
}
// 默认返回英文或未知
if (preg_match('/^[a-zA-Z\s.,!?\'"-]+$/', $text)) {
return '英文';
}
return '无法识别';
}
// 测试
echo detectLanguageSimple("Hello World"); // 英文
echo detectLanguageSimple("你好世界"); // 中文
echo detectLanguageSimple("こんにちは"); // 日文
echo detectLanguageSimple("안녕하세요"); // 韩文
检测Unicode范围(完整示例)
class LanguageDetector {
public static function detect($text) {
$text = trim($text);
if (empty($text)) return 'unknown';
$patterns = [
'中文' => '/[\x{4e00}-\x{9fff}\x{3400}-\x{4dbf}]/u',
'日文' => '/[\x{3040}-\x{309f}\x{30a0}-\x{30ff}]/u', // 平假名和片假名
'韩文' => '/[\x{ac00}-\x{d7af}\x{1100}-\x{11ff}]/u', // 韩文字母
'俄语' => '/[\x{0400}-\x{04ff}]/u',
'阿拉伯语' => '/[\x{0600}-\x{06ff}]/u',
'希腊语' => '/[\x{0370}-\x{03ff}]/u',
'泰语' => '/[\x{0e00}-\x{0e7f}]/u',
'希伯来语' => '/[\x{0590}-\x{05ff}]/u',
'英语' => '/^[\x{0041}-\x{007a}\x{20}\x{2c}\x{2e}\x{21}\x{3f}]+$/u'
];
foreach ($patterns as $lang => $pattern) {
if (preg_match($pattern, $text)) {
return $lang;
}
}
return 'unknown';
}
}
// 使用
echo LanguageDetector::detect("This is English");
echo LanguageDetector::detect("这是一个测试");
使用文件头检测(BOM)
function detectBOM($file) {
$handle = fopen($file, 'rb');
$firstBytes = fread($handle, 3);
fclose($handle);
$bomMap = [
"\xEF\xBB\xBF" => 'UTF-8',
"\xFE\xFF" => 'UTF-16BE',
"\xFF\xFE" => 'UTF-16LE',
"\x00\x00\xFE\xFF" => 'UTF-32BE',
"\xFF\xFE\x00\x00" => 'UTF-32LE'
];
foreach ($bomMap as $bom => $encoding) {
if (strpos($firstBytes, $bom) === 0) {
return $encoding;
}
}
return '未知编码';
}
综合检测示例
function analyzeText($text) {
$result = [
'encoding' => '',
'language' => '',
'info' => []
];
// 检测编码
$result['encoding'] = mb_detect_encoding($text,
['UTF-8', 'GB2312', 'GBK', 'BIG5', 'ISO-8859-1'], true);
// 检测语言
$result['language'] = LanguageDetector::detect($text);
// 其他信息
$result['info']['length'] = mb_strlen($text);
$result['info']['hasChinese'] = preg_match('/[\x{4e00}-\x{9fff}]/u', $text) > 0;
$result['info']['hasEnglish'] = preg_match('/[a-zA-Z]/', $text) > 0;
return $result;
}
// 使用示例
$text = "你好,世界!Hello World!";
print_r(analyzeText($text));
注意事项
- 准确性:基于字符范围的检测只能识别字符集,不能100%确定语言
- 混合语言:文本可能包含多种语言
- 性能:对于大量文本,建议使用专业API或库
- 扩展性:可以根据需要添加更多的语言检测规则
根据具体需求选择合适的方法即可,如果只是简单判断中英文,正则表达式就足够了;如果需要更准确的语言识别,建议使用专业的语言检测库。