UTF-8字符集在AJAX下中文乱码的解决办法
转自http://bbs.lampbrother.net/read-htm-tid-2610.html
本以为全部UTF-8 就不用关心乱码问题了呢 , 结果乱码还是来了.. 查了点英文资料 , 搞定.
方法很简单 , 直接对提交的数据进行编码即可..
但是 UTF-8 的 和ASCII的不怎么一样.. 下面是修正办法
var str = document.frm.username.value
修改成
var str = encode(document.frm.username.value)
然后在 这个标记前面 把下面代码复制进去
- var unreserved = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_.~";
- var reserved = "!*'();:@&=+$,/?%#[]";
- var allowed = unreserved + reserved;
- var hexchars = "0123456789ABCDEFabcdef";
- // --------------------------------- Encoding -------------------------------
- // This function returns a percent sign followed by two hexadecimal digits.
- // Input is a decimal value not greater than 255.
- function gethex(decimal) {
- return "%" + hexchars.charAt(decimal >> 4) + hexchars.charAt(decimal & 0xF);
- }
- function encode(str) {
- // Clear output field:
- // Some variables:
- var decoded = str;
- var encoded = "";
- for (var i = 0; i < decoded.length; i++ ) {
- var ch = decoded.charAt(i);
- // Check if character is an unreserved character:
- if (unreserved.indexOf(ch) != -1) {
- encoded = encoded + ch;
- } else {
- // The position in the Unicode table tells us how many bytes are needed.
- // Note that if we talk about first, second, etc. in the following, we are
- // counting from left to right:
- //
- // Position in | Bytes needed | Binary representation
- // Unicode table | for UTF-8 | of UTF-8
- // ----------------------------------------------------------
- // 0 - 127 | 1 byte | 0XXX.XXXX
- // 128 - 2047 | 2 bytes | 110X.XXXX 10XX.XXXX
- // 2048 - 65535 | 3 bytes | 1110.XXXX 10XX.XXXX 10XX.XXXX
- // 65536 - 2097151 | 4 bytes | 1111.0XXX 10XX.XXXX 10XX.XXXX 10XX.XXXX
- var charcode = decoded.charCodeAt(i);
- // Position 0 - 127 is equal to percent-encoding with an ASCII character encoding:
- if (charcode < 128) {
- encoded = encoded + gethex(charcode);
- }
- // Position 128 - 2047: two bytes for UTF-8 character encoding.
- if (charcode > 127 && charcode < 2048) {
- // First UTF byte: Mask the first five bits of charcode with binary 110X.XXXX:
- encoded = encoded + gethex((charcode >> 6) | 0xC0);
- // Second UTF byte: Get last six bits of charcode and mask them with binary 10XX.XXXX:
- encoded = encoded + gethex((charcode & 0x3F) | 0x80);
- }
- // Position 2048 - 65535: three bytes for UTF-8 character encoding.
- if (charcode > 2047 && charcode < 65536) {
- // First UTF byte: Mask the first four bits of charcode with binary 1110.XXXX:
- encoded = encoded + gethex((charcode >> 12) | 0xE0);
- // Second UTF byte: Get the next six bits of charcode and mask them binary 10XX.XXXX:
- encoded = encoded + gethex(((charcode >> 6) & 0x3F) | 0x80);
- // Third UTF byte: Get the last six bits of charcode and mask them binary 10XX.XXXX:
- encoded = encoded + gethex((charcode & 0x3F) | 0x80);
- }
- // Position 65536 - : four bytes for UTF-8 character encoding.
- if (charcode > 65535) {
- // First UTF byte: Mask the first three bits of charcode with binary 1111.0XXX:
- encoded = encoded + gethex((charcode >> 18) | 0xF0);
- // Second UTF byte: Get the next six bits of charcode and mask them binary 10XX.XXXX:
- encoded = encoded + gethex(((charcode >> 12) & 0x3F) | 0x80);
- // Third UTF byte: Get the last six bits of charcode and mask them binary 10XX.XXXX:
- encoded = encoded + gethex(((charcode >> 6) & 0x3F) | 0x80);
- // Fourth UTF byte: Get the last six bits of charcode and mask them binary 10XX.XXXX:
- encoded = encoded + gethex((charcode & 0x3F) | 0x80);
- }
- }
- } // end of for ...
- // Write result:
- return encoded;
- }
复制代码ok,大功告成!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论