JavaScript:实现包含土耳其字符的字符串单词首字母大写(其余字母转为小写)
解决土耳其语Unicode字符的单词首字母大写问题
我懂你遇到的困扰——用常规正则处理土耳其语这类带特殊Unicode字符的字符串时,\b单词边界完全不靠谱,导致大写位置全错了。咱们来搞定这个问题:
问题根源
正则里的\b是基于ASCII规则的单词边界,它会把土耳其语的ş、ö、ı这类特殊字符当成「非单词字符」,所以会在错误的位置触发匹配,比如şöhret里h前面的位置被识别成单词边界,就出现了şöHret这种错误结果。
解决方案
改用Unicode属性类来匹配字母,同时避开\b的坑,结合土耳其语的本地化大小写转换:
const myStr = "şöhret için önce çalışmak/gerek"; const capitalizedStr = myStr.toLocaleLowerCase("tr-TR") .replace(/(^|[^\p{L}])\p{L}/gu, (match, leadingChar) => { // 保留开头的非字母字符,把单词首字母转成土耳其语大写 return leadingChar + match.slice(-1).toLocaleUpperCase("tr-TR"); }); console.log(capitalizedStr); // 输出: Şöhret İçin Önce Çalışmak/Gerek
代码详解
toLocaleLowerCase("tr-TR"):先把整个字符串统一转成土耳其语标准的小写,确保像İ转成i、I转成ı这类符合土耳其语规则的转换。- 正则
/(^|[^\p{L}])\p{L}/gu:^匹配字符串开头,[^\p{L}]匹配任意非Unicode字母的字符(比如空格、斜杠)\p{L}匹配任意语言的Unicode字母(完美覆盖土耳其语的特殊字符)u标志开启Unicode模式,让正则支持\p{L}这类属性类g标志全局匹配所有符合条件的位置
- 替换函数:
leadingChar是捕获到的开头字符(可能是字符串开头的空,也可能是空格、斜杠这类分隔符)match.slice(-1)取到每个单词的第一个字母,用toLocaleUpperCase("tr-TR")转成土耳其语标准的大写(比如i转İ,ı转I,这是普通toUpperCase()做不到的)
这个方案不仅完美解决土耳其语的问题,还能适配其他带特殊Unicode字符的语言,只要替换对应的locale参数就行。
内容的提问来源于stack exchange,提问作者Nas Ahmet
相关产品推荐
相关产品推荐

