代码之家  ›  专栏  ›  技术社区  ›  Ethan Heilman

如何确保表单中编码的文本是utf8

  •  14
  • Ethan Heilman  · 技术社区  · 16 年前

    我有一个HTML框,用户可以用它输入文本。我想确保输入框中的所有文本都是以UTF-8编码的,或者在用户完成键入后转换为UTF-8。此外,我不太理解在输入文本框时如何选择各种各样的UTF编码。

    一般来说,我对以下内容很好奇:

    • 当用户输入文本框时,浏览器如何确定要使用哪些编码?
    • javascript如何确定HTML文本框中字符串值的编码?
    • 我可以强制浏览器只使用UTF-8编码吗?
    • 如何将任意编码编码编码为utf-8?我假设有一个javascript库用于此目的?

    **编辑**

    删除了一些对我的目标不必要的问题。

    本教程帮助我更好地理解JavaScript字符代码,但它有缺陷,并且在所有情况下都不会将字符代码转换为UTF-8。 http://www.webtoolkit.info/javascript-base64.html

    3 回复  |  直到 16 年前
        1
  •  16
  •   Brian Campbell Dennis Williamson    16 年前
    • 当用户输入文本框时,浏览器如何确定要使用哪些编码?

    它使用默认情况下对页进行解码的编码。根据 the spec ,您应该能够用 accept-charset 的属性 <form> 元素,但是ie有问题,所以你不应该依赖它(我看到过几个不同的来源描述了几个不同的bug,我没有所有相关版本的ie在我面前进行测试,所以我就不做了)。

    • javascript如何确定HTML文本框中字符串值的编码?

    javascript中的所有字符串都是以utf-16编码的。浏览器将把所有内容映射到JavaScript的UTF-16中,从UTF-16映射到页面编码的任何内容中。

    UTF-16是一种源自于UCS-2的编码。最初,人们认为65536个代码点足以满足所有Unicode,因此16位字符编码就足够了。结果发现情况并非如此,因此字符集被扩展到1114112个代码点。为了保持向后兼容性,为代理对留出了一些未使用的16位字符集范围,其中两个16位代码单元用于对单个字符进行编码。阅读 UTF-16 and UCS-2 on Wikipedia 详情。

    结果就是当你有一根绳子 str 在JavaScript中, str.length 如果一个字符不在基本多语言平面内,则不提供字符数,而是提供代码单位数,其中两个代码单位可用于对一个字符进行编码。例如, "abc".length 给你3,但是 "𐤀𐤁𐤂".length 给你6;和 "𐤀𐤁𐤂".substring(0,1) 给出一个看起来像空字符串的字符串,因为一半的代理项对无法显示,但该字符串仍然包含该无效字符(我不保证这可以跨浏览器工作;我相信删除中断字符是可以接受的)。要获得有效字符,必须使用 "𐤀𐤁𐤂".substring(0,2) .

    • 我可以强制浏览器只使用UTF-8编码吗?

    最好的方法是用UTF-8传递页面。确保您的Web服务器正在发送适当的 Content-type: text/html; charset=UTF-8 标题。您可能还希望嵌入 <meta charset="UTF-8"> 元素在你 <head> 元素,用于 Content-Type 设置不正确(例如,如果页面从本地磁盘加载)。

    • 如何将任意编码编码编码为utf-8?我假设有一个javascript库用于此目的?

    在javascript中,不需要对文本进行特别的编码。如果您只是在写DOM,或者读取或填充表单控件,那么您应该只使用被视为UTF-16代码单元序列的javascript字符串。 XMLHTTPRequest ,当习惯于 send(data) 通过post,将使用utf-8(如果您传递一个文档时使用了在 <?xml ...> 声明时,它可能会或可能不会将其转换为UTF-8,因此为了兼容性,通常不应该使用UTF-8以外的任何东西。

        2
  •  4
  •   bobince    16 年前

    我想确保框中输入的所有文本都是以UTF-8编码的

    包含输入字段的HTML DOM中的文本没有固有的字节编码;它存储为Unicode字符(特别是在DOM和EcmaScript标准级别,即UTF-16代码单位);在极少数情况下,您可以在基本多语言平面之外使用字符,例如可以看到差异。 '𝅘𝅥𝅯'.length 是2)。

    只有在发送表单时,才会使用特定编码将文本序列化为字节,默认情况下,与解析页面时使用的编码相同,因此应将包含表单的页面作为UTF-8(通过 Content-Type 页眉 charset 参数和/或等效值 <meta> 标签)。

    原则上,在 accept-charset 的属性 <form> 元素,在IE中它不能正常工作(并且在许多情况下是积极有害的)。 避免 那个。

    JavaScript本身没有明确的编码处理函数。您可以通过链接将一个Unicode-to-UTF-8字节编码器拼凑在一起。 unescape(encodeURIComponent(str)) (和反函数的情况类似),但这就是问题所在。

        3
  •  1
  •   Jonathan Feinberg    16 年前

    文本框中的文本不以任何方式编码;它是“文本”,一系列抽象字符。在几乎每一个当代的应用程序中,该文本都表示为一个Unicode代码点序列,这些代码点是映射到特定抽象字符的整数。文本在转换成字节序列之前不会被“编码”,就像提交表单时一样。当时,编码是由表单出现的HTML页面的编码决定的,或者由表单元素的accept charset属性决定的。