- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
要将一个String
设置为lowercase
,我们只需要在其上调用函数toLowerCase()
。但是,对于我现在使用的一种语言,没有这样的功能,所以我需要自己创建一个。 Javascript 如何能够手动实现这一点?
最佳答案
对于 ASCII,它只是一个简单的“获取字母的字符代码,加上 32,你就完成了,因为这就是 ASCII 中数字代码的排列方式”,但你问的是 JavaScript toLowerCase()
,这是一个 Unicode 函数:things are complicated .
在 Unicode 领域,不仅有单一的“大写 -> 小写”映射,还有“这个大写字符实际上是另一个大写字符的变体”字母,以及“这个看起来大写的字符是实际上是一个连字,需要分解成多个小写字符”,以及“这个大写字符没有等价的小写字母”,所以实际上一个合适的toLowerCase
函数必须检查Unicode 大小写数据,以确定如何将字符串中的每个字符转换为其等效的小写字母(如果存在)。
例如,对于拉丁字符(通常称为“ascii”字符,但事实并非如此:ASCII 是一组恰好 128 个代码,其中很多是不可打印的)我们看到这样的数据:
...
0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;
...
所以我们看到 A
,十六进制代码为 0x41,在代码 0x61 处有一个小写等效项:
...
0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041
...
所以对于这组代码,规则是:
if (0x41 <= codepoint <= 0x5A) newcodepoint = codepoint + 0x20
但是,我们只稍微向下移动了列表:
...
012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B;
012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A
...
在这里,小写和大写变体紧挨着彼此。加减 32 确实非常是错误的。相反,我们需要使用规则
if (0x0100 <= codepoint <= 0x012E) newcodepoint = codepoint + 1
所以一个真正的 toLowerCase
是一个三阶段函数:
此外,请注意,在第 1 步中,我们可能需要做比您想象的更多的工作,因为并非每种语言都允许将每个字母盲目映射为单个大写或小写字母:取决于字母在单词中的位置, 可能有不同 大写或小写等价物。只是为了让事情变得更有趣。
文本转换困难,这就是为什么您几乎从不尝试实现自己的版本的原因:这是乍一看似乎非常简单的主题之一,但当您真正坐下来研究时有一点,事实证明这疯狂困难,你真的需要整个团队只写一个函数,这样每个边缘情况都被覆盖并且没有因为你而滑入的错误碰巧错过了关于一些很少使用的字符的小规则。
因此,要回答有关如何为您正在使用的语言实现此功能的问题:您不会。找到一个支持您的语言的字符串库,并记录 toLowerCase()
在您的示例中无法正常工作的浏览器问题,因为这些是需要在其实现中修复的错误。
关于javascript - String.toLowerCase() 是如何工作的?如何手动创建该功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60249299/
我正在使用 AutoComplete API Material UI。有一个 的对象top100电影其中包含电影的标题和年份。如果我使用 top100Film.title 搜索,我的自动完成工作正常如
我想知道为什么 Character.toUpperCase/toLowerCase 没有像 String.toUpperCase/toLowerCase 这样的 Locale 参数。 我必须首先将可以
我有一个名为 Profiles 的集合,其中包含一个名为 emails 的数组。 我想将数组中的所有电子邮件字符串更改为小写。 db.Profiles.update({"emails":/@/i},
我在尝试处理的 Angular 错误消息时遇到问题。我试图确保确认电子邮件的不区分大小写不适用于初始电子邮件地址。 在我的 Controller 中,我使用了 toLowerCase() 过滤器...
我对 JavaScript 还很陌生。我需要两件事: 干燥我的代码。具体来说,{leo} 对象的 hasMoreOscarsThan 方法内部声明了很多变量。我需要在对象 {jenn}、{sam}、{
在土耳其语中,有一个字母 I,它是 i 的大写形式。当我将其转换为小写时,我得到了一个奇怪的结果。例如: var string_tr = "İ".toLowerCase(); var string_e
我有这段代码,它正在从文本框中读取值,我认为在尝试 parseInt() 之前检查 '' 是安全的,但显然不是。 我收到错误: Uncaught TypeError: Cannot call meth
找不到问题,但是一直显示这个错误!!使用 includes 等其他方法时也会发生同样的情况。 let notes = [{},{ title: 'My next trip', body
我正在尝试重构我的 js 代码以使其更加干练,但遇到了这个错误。这是我的代码 function validate_field(e){ console.log(typeof e); $(
我是 javascript 的新手,正在上几堂课。我想知道在 toLowerCase 命令末尾使用括号,因为即使你在它们之间放一个数字,它们也不会做任何事情。 谁能解释一下它们的用途? 最佳答案 to
什么更有效率?: var text="ABCdef"; var lowerVersion=text.toLowerCase(); if (lowerVersion=='abcdef' || lower
为什么 JS 对大写的 i (?) 有问题,而 javascript 对大写的 ş,ö,ç,ğ,ü (Ş,Ö,Ç,Ğ,Ü),如下所述? (问题与字母位置无关。) "İş".toLowerCase().
我知道这个问题已经被提出太多次了,但没有一个问题能解决我遇到的问题。每次运行该函数时都会出现以下错误: TypeError: Cannot read property 'toLowerCase' of
console.log("HİNDİ".toLocaleLowerCase() == "hindi"); console.log("HİNDİ" == "hindi"); console.log("H
我对这个符号有疑问——(不是——)。当我使用 tolowercase() 函数时,它显示 ����。我不知道如何解决这个问题。请帮忙。谢谢。 public String content = "nois
场景:我有一个文本框,下面是一个数据列表。当我在文本框中键入内容时,列表会根据文本框中的文本进行过滤。 代码: 管道: @Pipe({ name: 'search' }) export class
我有一个读取推文并尝试匹配关键字的小应用程序,我注意到特定字符串的这种奇怪行为: var text = "The Νіkе Dunk Ніgh ЅΒ 'Uglу Ѕwеаtеr' іѕ n
JSTL fn:toLowerCase() 函数与 fn:toUpperCase() 函数作用相反,用来将指定字符串中的所有字符转为小写。 语法 JSP fn:toLowerCase() 函数的
我想制作一个以小写形式返回估算文本的输入字段。我正在使用博览会 const [login, setLogin] = useState(''); //... setLogin(val.toLowerCa
我正在尝试将我的 React Native 更新到最新版本。我运行命令:react-native upgrade --verbose 但是,它正在返回: info No version passed.
我是一名优秀的程序员,十分优秀!