首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >String.normalize()有什么意义?

String.normalize()有什么意义?
EN

Stack Overflow用户
提问于 2020-07-21 11:30:30
回答 5查看 14.3K关注 0票数 11

在回顾JavaScript概念时,我发现了String.normalize()。这不是在W3学校的"JavaScript字符串引用“中出现的东西,因此,这也是我以前可能会错过它的原因。

我在HackerRank中找到了更多关于它的信息,其中声明:

返回包含调用字符串值的Unicode规范化形式的字符串。

举个例子:

代码语言:javascript
复制
var s = "HackerRank";
console.log(s.normalize());
console.log(s.normalize("NFKC"));

作为产出的:

代码语言:javascript
复制
HackerRank
HackerRank

同时,在GeeksForGeeks

string.normalize()是javascript中内置的函数,用于返回给定输入字符串的Unicode规范化形式。

举个例子:

代码语言:javascript
复制
<script> 
  
  // Taking a string as input. 
  var a = "GeeksForGeeks"; 
    
  // calling normalize function. 
  b = a.normalize('NFC') 
  c = a.normalize('NFD') 
  d = a.normalize('NFKC') 
  e = a.normalize('NFKD') 
    
  // Printing normalised form. 
  document.write(b +"<br>"); 
  document.write(c +"<br>"); 
  document.write(d +"<br>"); 
  document.write(e); 
    
</script> 

作为产出的:

代码语言:javascript
复制
GeeksForGeeks
GeeksForGeeks
GeeksForGeeks
GeeksForGeeks

也许给出的例子真的很糟糕,因为它们不允许我看到任何变化。

我想知道..。这种方法有什么意义?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-07-21 12:14:53

这取决于如何处理字符串:通常您不需要它(如果您只是从用户那里获得输入,并将其放入用户)。但是要检查/搜索/使用作为键/等等,您可能需要一种独特的方法来识别相同的字符串(从语义上讲)。

主要的问题是,您可能有两个字符串,它们在语义上是相同的,但是有两个不同的表示形式:例如,一个带有重音字符的字符串--一个代码点,一个带重音字符的字符串--一个字符的代码点,一个用于组合重音的字符串。用户可能无法控制输入文本的发送方式,因此您可能有两个不同的用户名或两个不同的密码。但是,如果您损坏数据,您可能会得到不同的结果,这取决于初始字符串。用户不喜欢它。

另一个问题是组合字符的独特顺序。你可能有一个重音,和一个较低的尾巴(例如雪茄烟):你可以用几个组合来表达这一点:“纯焦,尾,重音”,“纯焦,重音,尾”,"char+tail,重音“,"char+accent,雪松”。

而且您可能有退化的情况(特别是在键盘上输入时):您可能会得到应该删除的代码点(您可能有一个无限长的字符串,它可能相当于几个字节。

在任何情况下,要对字符串进行排序,您(或您的库)都需要一个规范化的表单:如果您已经提供了权限,则lib将不需要再次转换它。

因此:您希望相同(从语义上讲)字符串具有相同的unicode代码点序列。

注意:如果您直接使用UTF-8,您还应该关注UTF-8的特殊情况:可以使用更多的字节以不同的方式编写相同的代码点。这也可能是一个安全问题。

K通常用于“搜索”和类似的任务: CO2和CO₂将以相同的方式解释,但这可能会改变文本的含义,因此它通常只用于临时任务,但保留原始文本。

票数 6
EN

Stack Overflow用户

发布于 2020-07-21 11:40:07

正如MDN文档中所述,String.prototype.normalize()返回字符串的Unicode规范化形式。这是因为在Unicode中,某些字符可能有不同的表示代码。

这是一个例子(取自MDN):

代码语言:javascript
复制
const name1 = '\u0041\u006d\u00e9\u006c\u0069\u0065';
const name2 = '\u0041\u006d\u0065\u0301\u006c\u0069\u0065';

console.log(`${name1}, ${name2}`);
// expected output: "Amélie, Amélie"
console.log(name1 === name2);
// expected output: false
console.log(name1.length === name2.length);
// expected output: false

const name1NFC = name1.normalize('NFC');
const name2NFC = name2.normalize('NFC');

console.log(`${name1NFC}, ${name2NFC}`);
// expected output: "Amélie, Amélie"
console.log(name1NFC === name2NFC);
// expected output: true
console.log(name1NFC.length === name2NFC.length);
// expected output: true

如您所见,字符串Amélie作为两种不同的Unicode表示形式。通过规范化,我们可以将这两种形式简化为相同的字符串。

票数 4
EN

Stack Overflow用户

发布于 2020-12-28 10:20:07

在这里解释得非常漂亮--> 对象/字符串/规范化

简短的回答:重点是,字符是通过一个编码方案,如ascii,utf-8,等等(我们主要使用的是UTF-8)。有些字符有多个表示形式。因此,两个字符串可能呈现类似的,但它们的unicode可能有所不同!所以字符串比较在这里可能会失败!因此,我们使用规范返回一种类型的表示。

代码语言:javascript
复制
// source from MDN

let string1 = '\u00F1';                           // ñ
let string2 = '\u006E\u0303';                     // ñ

string1 = string1.normalize('NFC');
string2 = string2.normalize('NFC');

console.log(string1 === string2);                 // true
console.log(string1.length);                      // 1
console.log(string2.length);                      // 1
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63013552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档