PHP无法直接准确判断日文或韩文,但可通过Unicode区块分布(如韩文音节U+AC00–U+D7AF、日文假名U+3040–U+30FF)进行概率性倾向判断,辅以助词特征提升精度。

PHP 无法直接“判断”一段字符串是日文还是韩文,因为日文和韩文在 Unicode 中有大量重叠(比如共用汉字),且实际文本常混用。但可以通过分析字符的 Unicode 区块分布 + 常见语言特征,做**概率性倾向判断**,适用于大多数纯日文或纯韩文场景。
看主要 Unicode 区块分布
日文和韩文的核心字符落在不同 Unicode 范围,这是最基础的依据:
- 日文常用区块:平假名(U+3040–U+309F)、片假名(U+30A0–U+30FF)、日文汉字(基本在 U+4E00–U+9FFF,但和中文、韩文共用)、全角 ASCII(U+FF00–U+FFEF)等
- 韩文常用区块:谚文字母(U+1100–U+11FF)、谚文字母扩展-A(U+3130–U+318F)、谚文字母扩展-B(U+3200–U+32FF)、现代韩文音节(U+AC00–U+D7AF)——这个区块最重要,几乎只用于韩文
重点:U+AC00–U+D7AF(共约 11,172 个码位)是韩文音节的“合成区”,绝大多数韩文文本中都会高频出现;而日文文本中几乎不会出现该区字符(除非故意混入)。
用 preg_match 统计关键区块占比
写一个简单函数,分别统计韩文音节、平假名、片假名、谚文字母等出现次数,再按权重估算倾向:
立即学习“PHP免费学习笔记(深入)”;
function detectLanguage($str) {
$utf8 = mb_convert_encoding($str, 'UTF-8', 'auto');
$len = mb_strlen($utf8, 'UTF-8');
if ($len === 0) return 'unknown';
<pre class='brush:php;toolbar:false;'>// 韩文音节(强指示)
$korean_syllables = preg_match_all('/[\x{AC00}-\x{D7AF}]/u', $utf8);
// 平假名 + 片假名(日文强指示)
$hiragana = preg_match_all('/[\x{3040}-\x{309F}]/u', $utf8);
$katakana = preg_match_all('/[\x{30A0}-\x{30FF}]/u', $utf8);
$japanese_kana = $hiragana + $katakana;
// 谚文字母(兼容旧韩文输入)
$korean_jamo = preg_match_all('/[\x{1100}-\x{11FF}\x{3130}-\x{318F}]/u', $utf8);
// 简单规则判断(可按需调整阈值)
if ($korean_syllables > 0 && $japanese_kana === 0) return 'korean';
if ($japanese_kana > $korean_syllables * 3) return 'japanese';
if ($korean_syllables > $japanese_kana * 2) return 'korean';
// 混合或无明确特征时,看主导区块
if ($korean_syllables > 0 || $korean_jamo > 0) return 'korean';
if ($japanese_kana > 0) return 'japanese';
return 'unknown'; // 可能是中文、英文,或纯汉字文本}
注意:该函数不处理混合文本(如「東京ソウル」),也不识别训令式拼写或古日文。对简短字符串(如单个词)效果有限。
补充建议:结合常见词汇或停用字(进阶)
若需更高准确率,可加入轻量级词表匹配:
- 检测高频日文助词:「は」「が」「を」「に」「で」等(平假名)
- 检测韩文助词/结尾:「은/는」「이/가」「을/를」「에서」「까지」等(需分词或正则模糊匹配)
- 排除干扰:纯汉字词(如「学生」「銀行」)在日、韩、中文中都存在,不能单独作为依据
不过,完整分词依赖 ICU 或第三方库(如 MeCab、KoNLPy),PHP 原生不支持,一般项目中仅作辅助即可。
不推荐的做法
以下方法容易出错,应避免:
- 只查是否有汉字 → 日、韩、中文都用汉字
- 用 strlen() 替代 mb_strlen() → 多字节乱码导致计数错误
- 依赖 HTTP Accept-Language → 浏览器设置与内容语言无关
- 硬编码字符列表而不使用 Unicode 范围 → 维护困难且覆盖不全
本质上,这是个 NLP 前端小任务,够用就好。真实业务中,更可靠的方式是让用户选择语言,或配合后端模型(如 fastText)做多语言分类。



















