2009-09-16 40 views
12

Tôi muốn thay thế các dấu ngoặc kép thông minh như , , thành các dấu ngoặc kép thông thường. Ngoài ra, tôi muốn thay thế ©, ®. Tôi đã sử dụng đoạn mã sau. Nhưng nó không giúp được gì. Vui lòng giúp tôi giải quyết vấn đề này.Phương thức thay thế không hoạt động

str.replace(/[“”]/g, '"'); 
str.replace(/[‘’]/g, "'"); 
+0

Đây có thể là sự cố mã hóa ký tự. Bạn sử dụng mã hóa nào trong mã của mình và mã hóa nào có dữ liệu của bạn? – Gumbo

Trả lời

28

Sử dụng:

str = str.replace(/[“”]/g, '"'); 
str = str.replace(/[‘’]/g, "'"); 

hoặc để làm điều đó trong một tuyên bố:

str = str.replace(/[“”]/g, '"').replace(/[‘’]/g,"'"); 

Trong JavaScript (như trong nhiều ngôn ngữ khác) dây là không thay đổi - chuỗi "thay thế" phương pháp thực chỉ cần trả lại chuỗi mới thay vì sửa đổi chuỗi tại chỗ.

Các MDN JavaScript reference entry cho replace trạng thái:

Trả về một chuỗi mới với một số hoặc tất cả các trận đấu của một mô hình thay thế bằng một sự thay thế.

Phương thức này không thay đổi đối tượng String được gọi. Nó đơn giản trả về một chuỗi mới.

+2

cũng thấy: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/String/replace –

+0

Cảm ơn Jonathan - sẽ thêm liên kết vào câu trả lời. –

+0

Jon, tôi vẫn gặp vấn đề tương tự. –

3

thay thế cho trả về chuỗi kết quả

str = str.replace(/["']/, ''); 
1

Các OP không nói lý do tại sao nó không làm việc, nhưng có vẻ là vấn đề liên quan đến việc mã hóa của tập tin. Nếu tôi có một tập tin ANSI mã hóa và tôi làm:

var s = "“This is a test” ‘Another test’"; 
s = s.replace(/[“”]/g, '"').replace(/[‘’]/g,"'"); 
document.writeln(s); 

tôi nhận được:

"This is a test" "Another test" 

tôi chuyển đổi bảng mã UTF-8, cố định có dấu ngoặc kép thông minh (trong đó đã phá vỡ khi tôi đã thay đổi mã hóa), sau đó chuyển đổi trở lại ANSI và vấn đề đã biến mất.

Lưu ý rằng khi tôi sao chép và dán các đôi và đơn dấu ngoặc kép thông minh ra khỏi trang này vào tài liệu thử nghiệm của tôi (ANSI mã hóa) và chạy mã này:

var s = "“This is a test” ‘Another test’"; 
for (var i = 0; i < s.length; i++) { 
    document.writeln(s.charAt(i) + '=' + s.charCodeAt(i)); 
} 

tôi phát hiện ra rằng tất cả các dấu ngoặc kép thông minh xuất hiện như ? = 63.

Vì vậy, đối với OP, xác định nơi báo giá thông minh bắt nguồn và đảm bảo chúng là mã ký tự bạn mong đợi. Nếu không, hãy cân nhắc việc thay đổi mã hóa của nguồn để chúng đến như “ = 8220, ” = 8221, ‘ = 8216’ = 8217. Sử dụng vòng lặp của tôi để kiểm tra nguồn, nếu các dấu ngoặc kép thông minh hiển thị với bất kỳ giá trị charCodeAt() nào khác với các giá trị tôi đã liệt kê, replace() sẽ không hoạt động như được viết.

1

Để thay thế tất cả các dấu ngoặc kép thông thường bằng dấu ngoặc kép thông minh, tôi đang sử dụng một hàm tương tự. Bạn phải chỉ định CharCode là một số cài đặt mặc định của máy tính/trình duyệt có thể xác định các ký tự đơn giản khác nhau ("", ", ',').

Sử dụng CharCode với gọi ký tự ASCII, điều này sẽ loại bỏ chỗ cho lỗi trên các trình duyệt khác nhau và hệ điều hành. Điều này cũng hữu ích cho việc sử dụng song ngữ (dấu trọng âm, v.v.).

Để thay thế dấu ngoặc kép thông minh với chức năng trích dẫn

function unSmartQuotify(n){ 
    var name = n; 
    var apos = String.fromCharCode(39); 
    while (n.indexOf("'") > -1) 
     name = name.replace("'" , apos); 
    return name; 
} 

Để tìm các giá trị ASCII khác mà bạn có thể cần. Kiểm tra here.

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