隐藏问题及其各种解决方法概述
函数大写首字母([第一第一个=“”, ...休息]){return[first.toUpperCase(),…rest].join('');}大写首字母(“𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"
函数大写首字母(str){if(!str)返回“”;const firstCP=str.codePointAt(0);常量索引=第一个CP>0xFFFF?2 : 1;return String.fromCodePoint(firstCP).toUpperCase()+str.slice(index);}大写首字母(“𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"
函数大写首字母(str){if(!str)返回“”;var firstCodeUnit=字符串[0];if(firstCodeUnit<'\uD800'||firstCode Unit>'\uDFFF'){return str[0].toUpperCase()+str.slice(1);}return str.slice(0,2).toUpperCase()+str.slices(2);}大写首字母(“𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"
深入国际化(谁的资本化?)
函数大写首字母([第一第一个=“”, ...休息],区域设置){return[first.toLocaleUpperCase(locale),…rest].join('');}大写首字母(“意大利”,“en”)//“意大利”大写首字母(“italya”,“tr”)//“伊塔利亚”
这可以稍作调整,以处理字符串中多个单词的大写,具有相当好的准确性至少对某些语言而言,尽管如果这样做,无论主要语言是什么,都很难完全避免出现离奇的情况.
这个CWU公司
或更改_何时更新字符属性匹配以下所有代码点,嗯,上套管时发生变化在缺少特定语言环境数据的一般情况下.我们可以试试这个您可能希望了解其他与案例相关的Unicode字符属性具有.它是一基于标题的有向图字符,如很酷的区域可以探索,但如果我们在这里一一列举的话,我们会继续一整天。不过,如果你不熟悉,以下内容可以激发你的好奇心:\p{下}
是一个比\p{小写字母}
(又名\p{Ll}
)-方便图示由Unicode提供的此工具中的默认字符集比较.(注意:并非所有可以引用的内容都可以在ES正则表达式中使用,但您可能需要的大多数内容都是)。
JS中case-mapping的替代方案(Firefox和CSS喜欢荷兰!)
如果具有唯一区域设置/语言/正字法大小写规则的有向图碰巧有一个Unicode中的单一代码点“组合”表示,则可以使用这些代码点来明确大小写期望,如这个组合U+133 I-J有向图与荷兰语ij 例如即使在没有区域设置数据的情况下:
另一方面,预合成的有向图和类似的图有时会被弃用(就像那样,看起来!),并且在互换文本中可能是不受欢迎的,因为如果人们在实践中不按常规方式键入序列,那么可能会产生复制糊麻烦。不幸的是,在缺少预组合“提示”的情况下,显式语言环境在这里没有帮助(至少据我所知)。如果我们拼写伊塞尔梅尔
和一个普通人我
+j个
,大写首字母
即使我们明确指出,也会产生错误的结果荷兰
作为区域设置:
大写首字母('ijselmeer','nl');//“Ijsselmeer”:(
(我不完全确定是否有某些情况下行为与ICU数据可用性有关——也许其他人可以这么说。)
如果转换的目的是在web浏览器中显示文本内容,那么您有一个完全不同的选择,这可能是您的最佳选择:利用web平台的其他核心语言HTML和CSS的功能。使用HTMLlang=。。。
和CSS文本转换:。。。
,您得到了一个(伪)声明性解决方案,为用户代理留出了额外的空间“聪明。”JS API需要在所有浏览器(通常)中都具有可预测的结果,并且不能随意尝试启发式。然而,用户代理本身只对其用户负有义务,当输出针对人类时,启发式解决方案是公平的。如果我们告诉它“这段文字是荷兰语,但请将其大写显示”,现在不同浏览器的具体结果可能会有所不同,但这可能是它们各自能做的最好的结果。让我们看看:
<!DOCTYPE html><dl><dt>未转换伊斯塞尔梅尔<dt>以CSS和<code>lang=en大写ijsselmeer公司<dt>以CSS和<code>lang=nl大写ijsselmeer公司
在写作时,Chromium中的英语和荷兰语行都是伊塞尔梅尔
-它并不比JS好。但在Firefox中试试吧!显式注释的元素包含荷兰语内容呈现伊杰塞尔梅尔现在正确了!
这个解决方案是针对特定目的的(无论如何,它在Node中都不会对您有所帮助),但我之前没有注意到它,真是太傻了。
感谢@paul23在实践中进一步澄清IJ有向图的性质并促使进一步调查!