2012-08-05 42 views
24

Tôi đang tìm cách trong JavaScript để chuyển đổi các ký tự không phải ASCII thành chuỗi tương đương gần nhất, tương tự như PHPiconv hoạt động. Ví dụ: nếu chuỗi đầu vào là Rånades på Skyttis i Ö-vik, nó phải được chuyển đổi thành Ranades pa skyttis i o-vik. Tôi đã xem xét phpjs nhưng không bao gồm iconv.Chuyển đổi các ký tự không phải ASCII (dấu âm, dấu trọng âm ...) thành mã ASCII gần nhất (tạo slug)

Có thể thực hiện chuyển đổi như vậy trong JavaScript, nếu có thì làm cách nào?

+0

liên quan (nhưng không phải là một giải pháp chăn thật): [loại bỏ umlauts hoặc specialchars trong chuỗi javascript] (http://stackoverflow.com/q/4804885) –

+0

Điều này * có thể * không phải là nguyên bản có thể trong JavaScript mà không cần duy trì các bảng thay thế lớn (ít nhất, tôi chưa bao giờ thấy một phương pháp để làm điều đó). Không có cách nào để gửi dữ liệu đến một máy chủ và sử dụng iconv ở đó? –

+1

Tôi đã từng tạo một chức năng làm việc này. Xem http://userscripts.org/scripts/review/112070, Ctrl + F "' var RW759_normalize_accents' ". Nó được sử dụng để bình thường hóa các ký tự cho các tìm kiếm, tôi đã tự chọn các ký tự iirc với một công cụ được tạo cho mục đích cụ thể. Dựa trên [câu hỏi này] (http://stackoverflow.com/questions/227950/programatic-accent-reduction-in-javascript-aka-text-normalization-or-unaccentin) –

Trả lời

15

Cách đơn giản nhất tôi đã tìm thấy:

var str = "Rånades på Skyttis i Ö-vik"; 
var combining = /[\u0300-\u036F]/g; 

console.log(str.normalize('NFKD').replace(combining, '')); 
+2

[ECMAScript 6] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize). Tính đến hôm nay, nó chỉ được hỗ trợ bởi các bản alpha và Firefox mới nhất. Hứa hẹn. –

+0

Tôi đã sử dụng phương pháp này trong NodeJS. Có thể có một số mô-đun chuẩn hóa Unicode cho các máy khách, như [unorm] (https://github.com/walling/unorm) – Rez

+0

Node.js vẫn có các cổng iconv. –

3

Đó là vì iconv là một tiện ích UNIX được biên dịch gốc đằng sau các chức năng chuyển đổi bản đồ nhân vật i18n nhất.

Bạn sẽ không tìm thấy nó trong javascript trừ khi bạn truy cập một số thành phần trình duyệt.

Mã hóa là thuộc tính của tài liệu nên hầu hết việc triển khai javascript chỉ đơn giản là loại bỏ nó.

Bạn sẽ cần một thư viện js thuần túy cho các chuỗi không có dấu. Nó sẽ là tốt nhất để có một cho ngôn ngữ cụ thể mà bạn cần.

Cách đơn giản nhất là thông qua một số bảng dịch hoặc thậm chí thay thế regex.

như ở đây: http://lehelk.com/2011/05/06/script-to-remove-diacritics/

kiểm tra chủ đề này quá: Replacing diacritics in Javascript

+1

Tôi vừa mới nhận ra rằng việc thay thế dấu phụ bằng một ký tự 'ASCII' không phải là lý tưởng. Ví dụ: bằng tiếng Đức, 'ü' phải được chuyển thành' ue' và không chỉ 'u', xem http: //webmasters.stackexchange.com/questions/33032/how-to-handle-url-với-dấu phụ-ký tự. Dường như ngay cả 'iconv' cũng không làm ir (' php -r 'setLocale (LC_ALL, "de_DE"); biểu tượng echov ("UTF-8", "ASCII // TRANSLIT", "ü");' // -> u) ', do đó tôi nghĩ tôi sẽ tự tạo bảng dịch (dựa trên' biểu tượng' và được tinh chỉnh theo cách thủ công) và sử dụng chúng cho cả hai 'JavaCript' và' PHP'. – Max

+0

Theo [biểu tượng bình luận của người dùng] (http://nl3.php.net/manual/en/function.iconv.php#105507) thì biểu tượng sẽ chuyển 'ü' sang' ue' nếu ngôn ngữ được đặt thành tiếng Đức . – icc97

Các vấn đề liên quan