必须显式传入 locale 参数,因默认 locale 在土耳其语等语言中会导致大小写转换错误,如 "İstanbul".tolocalelowercase("tr") → "istanbul"(实际为 "ıstanbul"),而无参调用在英文系统下会错误转为 "istanbul"。

直接使用 String.prototype.toLocaleLowerCase() 时,若未指定语言环境(locale),浏览器会按默认 locale 处理大小写转换,这在土耳其语、阿塞拜疆语等语言中极易出错——例如土耳其字母 “I” 的小写不是 “i”,而是带点的 “ı”(U+0131),而 “İ”(U+0130)才是 “I” 对应的大写形式。因此,**必须显式传入 locale 参数**,才能获得符合目标语言规则的转换结果。
明确指定 locale,避免依赖系统默认
不推荐写法:"İSTANBUL".toLowerCase() 或 "İSTANBUL".toLocaleLowerCase()(无参数)。这两者在土耳其系统上可能意外返回正确结果,但在英文系统下会错误转为 "istanbul"(丢失大写点 I → 小写 ı 的映射)。
正确做法是始终传入对应语言的 BCP 47 标签:
-
"İSTANBUL".toLocaleLowerCase("tr")→"istanbul"(注意:此处 "i" 实际是 U+0131 ı,但多数字体显示相似;可通过.codePointAt(0)验证) -
"KIRIKKALE".toLocaleLowerCase("tr")→"kırıkkale"(“I” → “ı”,“K” 保持不变) -
"HELLO".toLocaleLowerCase("en-US")→"hello"(标准拉丁行为)
注意大小写映射的双向不对称性
土耳其语中,“I”/“İ” 和 “i”/“ı” 构成两对独立字符,大小写转换不是简单的一一映射:
-
"I".toLocaleLowerCase("tr")→"ı"(无点小写 i) -
"İ".toLocaleLowerCase("tr")→"i"(有点小写 i) -
"i".toLocaleUpperCase("tr")→"İ"(不是 "I") -
"ı".toLocaleUpperCase("tr")→"I"(不是 "İ")
这意味着:仅靠 toLowerCase 无法还原原始大小写;如需大小写无关比较,应统一用 toLocaleLowerCase("tr") 或 toLocaleUpperCase("tr") 转换双方再比对。
多语言混合文本需按语境分段处理
若字符串含土耳其语单词与英语专有名词(如 "İstanbul JavaScript Conference"),不能整体用 "tr" 或 "en" 转换——英语部分可能被误转(如 "JavaScript" 变成 "javascript",失去首字母大写惯例)。
更稳妥的方式:
- 识别语言边界(借助 Intl.Segmenter 或简单空格/标点分词)
- 对疑似土耳其语的词(如含
"İ"、"Ğ"、"Ş"等字符)单独调用.toLocaleLowerCase("tr") - 其余部分用
.toLocaleLowerCase("en-US")或保持原样
例如:"İstanbul".toLocaleLowerCase("tr") + " " + "JavaScript".toLocaleLowerCase("en-US") → "istanbul javascript"
兼容性与降级策略
所有现代浏览器均支持 toLocaleLowerCase(locales)(ECMAScript 6+)。若需支持极旧环境(如 IE11),可检测方法是否存在:
- 存在则用
str.toLocaleLowerCase("tr") - 不存在则回退到
str.toLowerCase(),但需在文档中明确标注:此场景下土耳其语转换不准确
也可引入轻量 polyfill(如 Intl.js)补全 Intl 支持,确保 toLocaleLowerCase 行为一致。










