我可以依赖charCodeAt()和fromCharCode()的行为保持不变吗?

Ikr*_*ani 6 javascript mysql unicode perl

我编写了一个个人Web应用程序,用于charCodeAt()将用户输入的文本转换为相关的字符代码(例如?转换8839为存储),然后将其发送到Perl,后者将它们发送到MySQL.要检索输入文本,应用程序用于fromCharCode()将数字转换回文本.

我选择这样做是因为Perl的unicode支持很难正确处理.所以Perl和MySQL只能看到数字,这让生活变得更加简单.

我的问题是,我可以依赖fromCharCode()总是将8834之类的数字转换为相关字符吗?我不知道它使用什么标准,但是假设它使用UTF-8,如果将来改为使用UTF-16,如果没有向后兼容性,这显然会破坏我的程序.

我知道我对这些概念的看法并不是那么清楚,因此请注意澄清我是否表现出误解.

phi*_*hag 9

fromCharCode假设所有字符都在基本多语言平面(BMP)中,并toCharCode处理Unicode 代码点,即0到65535(0xffff)之间的数字.Unicode和代码点是永久性的,因此您可以信任它们永远保持不变.

编码如UTF-8和UTF-16的取代码点(数字)和输出一个字节流的流.JavaScript有些奇怪,因为toCharCode根据UTF-16规则,BMP之外的字符必须通过两次调用来构造.但是,几乎你遇到的每一个角色(包括中文,日文等)都在BMP中,所以即使你不处理这些案例,你的程序也会有效.

您可以做的一件事是将数字转换回字节(以big-endian int16格式),并将结果文本解释为UTF-16.当前JavaScript实现中的行为fromCharCodetoCharCode修复,并且永远不会改变.

  • 因此`fromCharCode`和`toCharCode`显然不处理代码*points*,而是代码*units*.这意味着您必须处理单个代码单元序列,即将它们转换为JavaScript或Perl端的标量值. (2认同)
  • @Hawramani 是的,没错。不是用一个 Unicode 字符编写 `document.write(String.fromCharCode(0x1D49C))`,你必须手动发出两个 UCS-2 代码点,当在另一个宽度上组装时,它们将成为正确的东西。例如,`document.write(String.fromCharCode(0xD835,0xDC9C))`。很恶心。 (2认同)

tch*_*ist 5

我选择这样做是因为Perl的unicode支持很难正确处理.

这是真的!

Perl对任何主要编程语言都有最强大的Unicode支持.这是很多,如果你使用Perl更容易使用Unicode的工作比,如果你使用任何C,C的++,Java和C ,Python和Ruby,PHP或JavaScript.这不是未受过教育的盲目忠诚的夸张和助推.基于十多年的专业经验和学习,这是一项经过深思熟虑的评估.

天真用户遇到的问题几乎总是因为他们欺骗了自己的Unicode.头号最糟糕的大脑错误认为Unicode就像ASCII,但更大.这绝对是完全错误的.正如我在别处写的:

从根本上讲,并不是真的 U that只是相对于ᴀsᴄɪɪ的一些放大字符集.至多,这只不过是stsᴏ-10646.Uɴɪᴄᴏᴅᴇ包括更多的只是数字到字形的分配:整理和比较的规则,三种形式的套管,非字母套管,多码点案例折叠,规范和兼容的组合和分解规范化形式,序列化形式,字形集群,单词和换行符,脚本,数字等值,宽度,双向性,镜像,打印宽度,逻辑排序排除,字形变体,上下文行为,区域设置,正则表达式,多种形式的组合类,多种类型的分解,数百和数百非常有用的属性,以及更多!

是的,这很多,但它与Perl无关.它与Unicode有关.Perl允许您在使用Unicode时访问这些内容不是错误而是功能.这与其他语言都无法让你Unicode的完全访问权限无法能够被理解为有利于自己的一个观点:更确切地说,这些都是可能的最高程度的所有主要的错误,因为如果你不能使用Unicode在21世纪的工作,那么这种语言对于现代文本处理的苛刻要求来说是一种原始的,破碎的,根本无用的.

Perl不是.在Perl中使用这些东西比在其他语言中做这些事情要容易多了几百倍; 在大多数人中,你甚至无法开始解决他们的设计缺陷.你只是简单地搞砸了.如果某种语言不能提供完整的Unicode支持,那么它就不适合本世纪; 丢弃它.

Perl使得Unicode比无法正确使用Unicode的语言更容易.

这个答案中,您将在前面找到用于在Perl中处理Unicode的七个简单步骤,在相同答案的底部,您将找到一些有用的样板代码.理解它,然后使用它.不要接受破碎.您必须先学习Unicode才能使用Unicode.

这就是为什么没有简单的答案.只要 您了解Unicode的真正含义,Perl就可以轻松使用Unicode .如果您正在处理外部源,那么您必须安排该源使用某种编码.

还阅读了我所说的所有内容.那些是你真正需要理解的东西.规则# 49之外的另一个破坏问题是Javascript被破坏,因为它不会以完全相同的方式处理所有有效的Unicode代码点,而与它们的平面无关.Javascript几乎在所有其他方面都被打破了.它不适合Unicode工作.只要规则# 34会杀了你,因为你不能得到的Javascript遵循什么规定的标准之类的东西\w被定义在做的Unicode正则表达式.

令人惊讶的是,有多种语言对Unicode完全没用.但Perl绝对不是其中之一!

  • 有点强硬,这个答案.我接受JavaScript并不适合Unicode工作,但是对于客户端脚本来说并不是真正的替代方案,所以我们必须充分利用它.尽管如此. (2认同)