toLowerCase() 按 Unicode 标准转换,无法正确处理土耳其语中带点/不带点的 i/I;toLocaleLowerCase("tr") 依据土耳其语规则,将 "I"→"ı"、"İ"→"i",推荐在国际化场景中显式指定 locale。

在处理土耳其语等特殊语言时,toLowerCase() 和 toLocaleLowerCase() 的行为差异很关键:前者按 Unicode 标准转换,后者依据当前语言环境(locale)规则,能正确处理如土耳其语中带点/不带点的 i 和 I。
土耳其语的大小写特殊性
土耳其语字母表中,小写 i 对应大写 İ(带点),而小写 ı(不带点)对应大写 I(不带点)。这与英语等拉丁语系完全不同。JavaScript 默认的 toLowerCase() 不考虑这一规则,直接按 Unicode 映射,导致转换错误。
-
"İ".toLowerCase()→"i"(错误:应为"i"?等等——注意:这是大写带点 İ → 小写应为"i",但问题出在反向:"I"大写不带点,本该转成"ı",而toLowerCase()却转成"i") -
"I".toLowerCase()→"i"(错误:应为"ı") -
"i".toUpperCase()→"I"(错误:应为"İ")
用 toLocaleLowerCase() 正确处理土耳其语
指定 locale(如 "tr")后,toLocaleLowerCase() 会启用土耳其语的大小写映射规则:
-
"I".toLocaleLowerCase("tr")→"ı"✅ -
"İ".toLocaleLowerCase("tr")→"i"✅ -
"TEST İSTANBUL IŞIK".toLocaleLowerCase("tr")→"test istanbul ışık"✅
建议始终显式传入 locale 参数(如 "tr"),避免依赖运行时默认 locale(可能不可靠或被用户修改)。
实际使用建议
- 做大小写不敏感比较前,统一用相同 locale 转换:
"Istanbul".toLocaleLowerCase("tr") === "istanbul".toLocaleLowerCase("tr") - 表单输入、搜索匹配、国际化文本处理等场景,优先选用
toLocaleLowerCase(locale)或toLocaleUpperCase(locale) - 若需兼容旧环境(如 IE),注意
toLocaleLowerCase("tr")在 IE 中支持有限,可降级为toLowerCase()并加注释说明局限 - Node.js 和现代浏览器均支持多 locale,可用
Intl.Locales检查是否支持:typeof Intl === 'object' && typeof Intl.getCanonicalLocales === 'function'
其他受影响的语言
除土耳其语("tr")外,立陶宛语("lt")、阿塞拜疆语("az")等也存在类似大小写特殊性。例如立陶宛语中,带重音的 "Ą" 小写为 "ą",且某些连字行为受 locale 影响。只要明确目标语言,就应使用对应 locale 调用 toLocaleLowerCase()。

















