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

时间:2010-01-03 03:16:00

标签: javascript html encoding utf-8

我有一个用户可以输入文字的html框。我想确保在框中输入的所有文本都以UTF-8编码或在用户完成输入时转换为UTF-8。此外,我不太清楚在输入文本框时如何选择各种UTF编码。

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

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

**编辑**

删除了一些不符合我目标的问题。

本教程帮助我更好地理解JavaScript字符代码,但是在所有情况下都没有错误,并且实际上并没有将字符代码转换为utf-8。 http://www.webtoolkit.info/javascript-base64.html

3 个答案:

答案 0 :(得分:16)

  
      
  • 当用户在文本框中输入时,浏览器如何确定要使用哪些编码?
  •   

它使用默认情况下解码页面的编码。根据{{​​3}},你应该可以使用accept-charset元素的<form>属性覆盖它,但是IE是错误的,所以你不应该依赖它(我见过几个不同的来源描述了几个不同的错误,我没有在我面前测试IE的所有相关版本,所以我会把它留在那里。

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

JavaScript中的所有字符串都以UTF-16编码。浏览器会将所有内容映射到UTF-16 for JavaScript,并将UTF-16映射到编码的页面。

UTF-16是一种源自UCS-2的编码。最初,人们认为65,536个代码点对于所有Unicode都足够了,因此16位字符编码就足够了。事实证明情况并非如此,因此字符集扩展到1,114,112个代码点。为了保持向后兼容性,为代理对留出了一些未使用的16位字符集范围,其中两个16位代码单元用于编码单个字符。有关详细信息,请阅读the spec

结果是当你在JavaScript中有一个字符串str时,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以外的任何东西。

答案 1 :(得分:4)

  

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

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

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

虽然原则上在accept-charset元素的<form>属性中有一个覆盖,但它在IE中无法正常工作(并且在很多情况下都是有效的)。所以避免那一个。

JavaScript本身没有明确的编码处理函数。你可以通过链接unescape(encodeURIComponent(str))来破解Unicode到UTF-8字节的编码器(和反函数的反过来相似),但这就是它。

答案 2 :(得分:1)

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