2012-07-25 23 views
7

Tôi đang so sánh các chuỗi và phải thay thế umlauts trong JS, nhưng có vẻ như JS không nhận ra các umlauts trong chuỗi. Các văn bản đến từ cơ sở dữ liệu và trong trình duyệt các umlauts làm tốt.Thay thế umlauts trong JS

function replaceUmlauts(string) 
{ 
    value = string.toLowerCase(); 
    value = value.replace(/ä/g, 'ae'); 
    value = value.replace(/ö/g, 'oe'); 
    value = value.replace(/ü/g, 'ue'); 
    return value; 
} 

Như các mẫu tìm kiếm tôi đã cố gắng:

  • "a", "ö", "ü"
  • /a /,/o /,/ü/
  • "ä" , "ö", "ü" (cũng hoàn toàn tuyệt vọng ;-))

Để chắc chắn, không phải là vấn đề với chức năng thay thế Tôi cố gắng indexOf:

console.log(value.indexOf('ä')); 

Nhưng đầu ra với tất cả các mô hình là: -1

Vì vậy, tôi đoán nó là một số loại của một vấn đề với mã hóa, nhưng như tôi đã nói trên trang mà umlauts làm chỉ cần nhìn tốt .

Bất kỳ ý tưởng nào? Điều này có vẻ rất đơn giản ...

EDIT: Ngay cả khi tôi tìm thấy câu trả lời của mình, vấn đề vẫn chưa thực sự được giải quyết "ở gốc" (bảng mã). Đây là mã hóa trang của tôi:

<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> 

Cơ sở dữ liệu có: utf8_general_ci

Có vẻ hoàn toàn ổn với tôi.

+1

mã hóa nào bạn sử dụng trong cơ sở dữ liệu của bạn và bạn sử dụng mã hóa nào trong trang web của mình? – Marc

+0

Và chuỗi là gì ??? Đăng nhập. Cách tiếp cận của bạn sẽ hoạt động, nhưng như bạn có thể thấy từ indexOf của bạn, chuỗi của bạn không chứa "ä". – Bergi

+0

'" bäg ".replace (/ ä/g," ae "); // ==> "baeg" ', vì vậy, có thể có gì đó không đúng với mã hóa của bạn –

Trả lời

21

Đảm bảo mã hóa tập lệnh của bạn được chỉ định chính xác (trong <script> thẻ hoặc trong tiêu đề trang/meta nếu được nhúng) hoặc chỉ định các ký hiệu với cú pháp \uNNNN sẽ luôn giải quyết một cách rõ ràng với một số điểm mã Unicode cụ thể.

Ví dụ:

str.replace(/\u00e4/g, "ae") 

Sẽ luôn luôn thay ä với ae, không có vấn đề gì mã hóa được thiết lập cho trang/script của bạn, ngay cả khi nó là không chính xác.

Dưới đây là các mã cần thiết cho các ngôn ngữ Đức:

// Ü, ü  \u00dc, \u00fc 
// Ä, ä  \u00c4, \u00e4 
// Ö, ö  \u00d6, \u00f6 
// ß  \u00df 
+0

Cảm ơn bạn rất nhiều, điều này hoạt động :-) Tôi có mã hóa utf-8 trên trang: có vẻ hoàn toàn đúng đối với tôi, vì vậy tôi sẽ chỉ làm việc với điều đó ... – SamiSalami

+0

Dưới đây là các mã: // u, u \t \t \ u00dc, \ u00fc // A, một \t \t \ u00c4, \ u00e4 // Ö, ö \t \t \ u00d6, \ u00f6 // ß \t \t \ u00df –

+0

Å cho các quốc gia Bắc Âu: // Å, å: \ u00c5, \ u00e5 –

1

Trước tiên, bạn cần tìm ra mã ký tự mà bạn đang cố thay thế. Ví dụ, tùy thuộc vào mã hóa ký tự, các ký tự có thể là 8859, UTF-8 hoặc một cái gì đó khác. Chúng cũng có thể là ký hiệu ký tự như "ä"

Thay vì đoán, hãy in chúng ra.

Và hãy cẩn thận rằng dữ liệu đến của bạn có thể không sử dụng cùng một bộ ký tự/mã hóa ký tự giống nhau - bạn cần phải kiểm tra xem dữ liệu đến từ đâu.

Vì vậy, hãy xem dữ liệu đến bằng cách sử dụng chuỗi. charCodeAt

Kiểm tra mã ký tự trước toLowerCase để đảm bảo rằng mã đó không thay đổi mọi thứ đối với bạn. Bạn sẽ cần gỡ lỗi từng bước một.

Cuối cùng, hãy kiểm tra cài đặt bộ ký tự trong trình chỉnh sửa của bạn để đảm bảo rằng bạn đã nhập ä là đúng. Bạn có thể muốn chỉ định nó qua giá trị UTF8 thay vì gõ ä, ö vv

+2

Không có vấn đề gì bạn sử dụng làm mã hóa trong trang, trong JS tất cả mọi thứ là Unicode và umlaut sẽ luôn ** có chính xác cùng một mã. –

+0

Tôi nghĩ rằng mã hóa tài liệu của tôi (tệp của tôi trong trình chỉnh sửa) không quan trọng, bởi vì văn bản đến từ cơ sở dữ liệu, vì vậy chỉ mã hóa trong cơ sở dữ liệu và trong thẻ meta html phải quan trọng hay không? Và định dạng của hàm của bạn khá khó hiểu, nó phải là string.charCodeAt (0); (0 là vị trí đầu tiên), nhưng tôi thực sự không nghĩ về nó và nó là một đầu mối tốt, tiếc là nó đã không giúp đỡ - unicode phải được trả lại trước khi toLowerCase cũng như sau đó. – SamiSalami

6

Dưới đây là một chức năng thay thế ký tự phổ biến nhất để tạo ra một thân thiện url SEO Google:

function deUmlaut(value){ 
    value = value.toLowerCase(); 
    value = value.replace(/ä/g, 'ae'); 
    value = value.replace(/ö/g, 'oe'); 
    value = value.replace(/ü/g, 'ue'); 
    value = value.replace(/ß/g, 'ss'); 
    value = value.replace(/ /g, '-'); 
    value = value.replace(/\./g, ''); 
    value = value.replace(/,/g, ''); 
    value = value.replace(/\(/g, ''); 
    value = value.replace(/\)/g, ''); 
    return value; 
} 
Các vấn đề liên quan