Hướng dẫn encode utf-8 javascript - mã hóa javascript utf-8

Tôi muốn xóa tất cả các ký tự UTF-8 không hợp lệ khỏi một chuỗi trong JavaScript. Tôi đã thử với JavaScript này:

var bytelike= unescape(encodeURIComponent(characters));
2

Có vẻ như Regex xác thực UTF-8 được mô tả ở đây (liên kết bị loại bỏ) hoàn chỉnh hơn và tôi đã điều chỉnh nó theo cùng một cách như:

var bytelike= unescape(encodeURIComponent(characters));
3

Cả hai đoạn mã này dường như cho phép UTF-8 hợp lệ thông qua, nhưng không lọc ra bất kỳ ký tự UTF-8 xấu nào từ dữ liệu thử nghiệm của tôi: Khả năng giải mã UTF-8 và kiểm tra ứng suất. Hoặc là các nhân vật xấu đi qua không thay đổi hoặc dường như có một số byte của họ bị xóa tạo ra một ký tự mới, không hợp lệ.

Tôi không quen thuộc lắm với tiêu chuẩn UTF-8 hoặc với Multibyte trong JavaScript nên tôi không chắc liệu tôi không thể đại diện cho UTF-8 thích hợp trong Regex hay nếu tôi áp dụng Regex đó không đúng trong JavaScript.

EDIT: Đã thêm cờ toàn cầu vào bình luận của Regex mỗi Tomalak - tuy nhiên điều này vẫn không hiệu quả với tôi. Tôi đang từ bỏ việc làm điều này về phía khách hàng theo bình luận của Bobince.

Hướng dẫn encode utf-8 javascript - mã hóa javascript utf-8

HALFER

Huy hiệu vàng 19.6K1717 gold badges92 silver badges176 bronze badges17 gold badges92 silver badges176 bronze badges

Hỏi ngày 19 tháng 4 năm 2010 lúc 19:03Apr 19, 2010 at 19:03Apr 19, 2010 at 19:03

Matthew Sielskimatthew SielskiMatthew SielskiMatthew Sielski

1.1071 Huy hiệu vàng12 Huy hiệu bạc14 Huy hiệu đồng1 gold badge12 silver badges14 bronze badges1 gold badge12 silver badges14 bronze badges

1

Tôi sử dụng cách tiếp cận đơn giản và chắc chắn này:

function cleanString(input) {
    var output = "";
    for (var i=0; i

Về cơ bản, tất cả những gì bạn thực sự muốn là ASCII chars 0-127, vì vậy chỉ cần xây dựng lại chuỗi char của char. Nếu đó là một char tốt, hãy giữ nó - nếu không, bỏ nó. Khá mạnh mẽ và nếu vệ sinh là mục tiêu của bạn, nó đủ nhanh (thực tế nó thực sự nhanh).

Đã trả lời ngày 7 tháng 11 năm 2013 lúc 5:54Nov 7, 2013 at 5:54Nov 7, 2013 at 5:54

6

Chuỗi JavaScript là Unicode tự nhiên. Chúng giữ các chuỗi ký tự* không phải các chuỗi byte, do đó, một người không thể chứa một chuỗi byte không hợp lệ.

.

Bạn có thể, nếu bạn cần vì một số lý do, hãy tạo một chuỗi giữ các ký tự được sử dụng làm người giữ chỗ cho byte. I E. Sử dụng ký tự

var bytelike= unescape(encodeURIComponent(characters));
4 ('\ x80') để đứng cho byte 0x80. Đây là những gì bạn sẽ nhận được nếu bạn mã hóa các ký tự thành byte bằng UTF-8, sau đó giải mã chúng trở lại các ký tự bằng ISO-8859-1 do nhầm lẫn. Có một thành ngữ JavaScript đặc biệt cho điều này:
var bytelike= unescape(encodeURIComponent(characters));

và để lấy lại từ UTF-8 pseudobyte trở lại các ký tự:

var characters= decodeURIComponent(escape(bytelike));

.

Bạn có thể, nếu bạn cần vì một số lý do, hãy tạo một chuỗi giữ các ký tự được sử dụng làm người giữ chỗ cho byte. I E. Sử dụng ký tự

var bytelike= unescape(encodeURIComponent(characters));
4 ('\ x80') để đứng cho byte 0x80. Đây là những gì bạn sẽ nhận được nếu bạn mã hóa các ký tự thành byte bằng UTF-8, sau đó giải mã chúng trở lại các ký tự bằng ISO-8859-1 do nhầm lẫn. Có một thành ngữ JavaScript đặc biệt cho điều này:
var bytelike= unescape(encodeURIComponent(characters));

và để lấy lại từ UTF-8 pseudobyte trở lại các ký tự:Apr 19, 2010 at 19:31

var bytelike= unescape(encodeURIComponent(characters));
7, vì nó hoạt động giống như bộ giải mã UTF-8, sẽ gây ra lỗi nếu chuỗi các đơn vị mã được đưa vào nó sẽ không được chấp nhận dưới dạng byte UTF-8.bobince

Rất hiếm khi bạn cần phải làm việc trên các chuỗi byte như thế này trong JavaScript. Tốt hơn để tiếp tục làm việc nguyên bản trong unicode ở phía khách hàng. Trình duyệt sẽ chăm sóc mã hóa UTF-8 trên dây (trong một lần gửi biểu mẫu hoặc XMLHTTPREQUEST).102 gold badges646 silver badges825 bronze badges

6

Đã trả lời ngày 19 tháng 4 năm 2010 lúc 19:31Apr 19, 2010 at 19:31

function cleanString(input) {
    var output = "";
    for (var i=0; i= 160 && input.charCodeAt(i) <= 255) {
            output += input.charAt(i);
        }
    }
    return output;
}

BobincebobincebobinceAug 21, 2019 at 14:13

O'NeillO'NeillO'NeillO'Neill

519K102 Huy hiệu vàng646 Huy hiệu bạc825 Huy hiệu Đồng102 gold badges646 silver badges825 bronze badges2 silver badges5 bronze badges

Các ngôn ngữ như tiếng Tây Ban Nha và tiếng Pháp có các nhân vật có dấu như "é" và mã nằm trong phạm vi 160-255 Xem https://www.ascii.cl/htmlcodes.htm

strTest = strTest.replace(/your regex here/g, "$1");
// ----------------------------------------^

Đã trả lời ngày 21 tháng 8 năm 2019 lúc 14:13Aug 21, 2019 at 14:13

3462 Huy hiệu bạc5 Huy hiệu Đồng2 silver badges5 bronze badges

var re = /(?![\x00-\x7F]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3})./g;
strTest = strTest.replace(re, "")

Sai lầm đơn giản, hiệu ứng lớn:

Không có cờ "Toàn cầu", việc thay thế chỉ xảy ra cho trận đấu đầu tiên.

Lưu ý bên: Để loại bỏ bất kỳ ký tự nào không hoàn thành một số loại điều kiện phức tạp, như rơi vào một tập hợp các phạm vi ký tự unicode nhất định, bạn có thể sử dụng Lookahead tiêu cực:Apr 19, 2010 at 19:07

trong đó Tomalak

var bytelike= unescape(encodeURIComponent(characters));
8 đọc là
var bytelike= unescape(encodeURIComponent(characters));
166 gold badges515 silver badges618 bronze badges

1

Đã trả lời ngày 19 tháng 4 năm 2010 lúc 19:07Apr 19, 2010 at 19:07

var bytelike= unescape(encodeURIComponent(characters));
2

TomalaktomalakTomalakApr 15, 2016 at 16:32

326K66 Huy hiệu vàng515 Huy hiệu bạc618 Huy hiệu Đồng66 gold badges515 silver badges618 bronze badgesDan Mantyla

Nếu bạn đang cố gắng xóa "ký tự không hợp lệ" - � - từ các chuỗi JavaScript thì bạn có thể loại bỏ chúng như thế này:1 gold badge21 silver badges33 bronze badges

Đã trả lời ngày 15 tháng 4 năm 2016 lúc 16:32Apr 15, 2016 at 16:32

var bytelike= unescape(encodeURIComponent(characters));
9
var bytelike= unescape(encodeURIComponent(characters));
4

Dan Mantyladan MantylaDan Mantyla

var characters= decodeURIComponent(escape(bytelike));
0

1.8001 Huy hiệu vàng21 Huy hiệu bạc33 Huy hiệu đồng1 gold badge21 silver badges33 bronze badges

var bytelike= unescape(encodeURIComponent(characters));
9
var bytelike= unescape(encodeURIComponent(characters));
7

Kết quả tất nhiên là một chuỗi loại trừ các ký tự đánh dấu câu hỏi.

Tôi biết bạn đã đi với một giải pháp khác hoàn toàn, nhưng tôi nghĩ rằng tôi sẽ đăng giải pháp của mình trong trường hợp bất kỳ ai khác gặp rắc rối với điều này và không thể sử dụng phương pháp tiếp cận ngôn ngữ phụ của máy chủ.

Đã trả lời ngày 29 tháng 1 năm 2012 lúc 5:11Jan 29, 2012 at 5:11Jan 29, 2012 at 5:11

Marcus Popemarcus Giáo hoàngMarcus PopeMarcus Pope

2.29320 Huy hiệu bạc25 Huy hiệu Đồng20 silver badges25 bronze badges20 silver badges25 bronze badges

Tôi đã sử dụng giải pháp của @Ali để không chỉ làm sạch chuỗi của mình mà còn thay thế các ký tự không hợp lệ bằng thay thế HTML:

var bytelike= unescape(encodeURIComponent(characters));
0

Barbsan

3.36811 Huy hiệu vàng20 Huy hiệu bạc28 Huy hiệu đồng11 gold badges20 silver badges28 bronze badges11 gold badges20 silver badges28 bronze badges

Đã trả lời ngày 17 tháng 7 năm 2019 lúc 10:46Jul 17, 2019 at 10:46Jul 17, 2019 at 10:46

DorandoranDoranDoran

6111 huy hiệu đồng11 bronze badges11 bronze badges

Tôi đã kết hợp một số giải pháp được đề xuất ở trên để an toàn cho lỗi

var bytelike= unescape(encodeURIComponent(characters));
1

Đã trả lời ngày 31 tháng 5 năm 2019 lúc 13:46May 31, 2019 at 13:46May 31, 2019 at 13:46

Loretoparisiloretoparisiloretoparisiloretoparisi

Huy hiệu vàng 14.9k1193 Huy hiệu bạc133 Huy hiệu đồng11 gold badges93 silver badges133 bronze badges11 gold badges93 silver badges133 bronze badges

3