2010-03-20 33 views
6

Tôi sử dụng document.getElementById("text").value.length để nhận độ dài chuỗi qua javascript và mb_strlen($_POST['text']) để nhận độ dài chuỗi bằng PHP và cả hai khác nhau rất nhiều. Trả về vận chuyển được chuyển đổi trong javascript trước khi nhận được độ dài chuỗi, nhưng tôi đoán một số ký tự không được tính.Độ dài chuỗi Javascript khác với PHP mb_strlen

Ví dụ,

[b] 15. Umieszczanie obrazka z logo na stronie zespołu [/ b]

Khối văn bản này được tính 57 trong javascript và 58 bằng PHP. Khi văn bản dài, chênh lệch tăng lên. Có cách nào để vượt qua điều này không?

+0

mã hóa gì bạn đang làm việc với bên JavaScript? –

+0

Bạn có thể tạo một ví dụ với nhiều sự khác biệt hơn chỉ một (có thể giảm số lần ngắt dòng hay bất kỳ thứ gì)? Có lẽ, các ký tự đặc biệt hơn như 'ł' bạn sử dụng, khoảng cách sẽ mở rộng. –

+3

Bạn đã thử sử dụng đối số thứ hai tùy chọn để chỉ định mã hóa chưa? Tôi cho rằng bạn đã sao chép mẫu cho chúng tôi ascii và rằng chuỗi thực sự không phải là. – Fredrik

Trả lời

0

Tôi nhận thấy rằng có một ký tự không chuẩn trong đó (the ł) - Tôi không chắc PHP tính như thế nào không chuẩn - nhưng nó có thể đếm là hai. Điều gì sẽ xảy ra nếu bạn chạy thử nghiệm mà không có ký tự đó?

+0

Nếu không có nó chính xác, tôi đã nghi ngờ rằng đó là về mã hóa ... Có chức năng tương đương cho Javascript không? – TheOnly92

+0

@ TheOnly92, tại sao bạn muốn sửa chữa nó cuối cùng đó là làm nó đúng? Nó không phải là tốt hơn để nói cho PHP kết thúc như thế nào nó nên tính toán chiều dài một cách chính xác (xem bình luận của Matthew cho câu hỏi của bạn). – Fredrik

+0

Thực tế là collation lưu trữ cơ sở dữ liệu của tôi không tính đến utf8 vào tài khoản mà tôi nghĩ, nó đếm những độ dài ký tự như 2 ... – TheOnly92

1

Tôi đã tìm thấy một chức năng tương đương mb_strlen cho Javascript, có lẽ điều này có thể có ích cho người khác:

function mb_strlen(str) { 
    var len = 0; 
    for(var i = 0; i < str.length; i++) { 
     len += str.charCodeAt(i) < 0 || str.charCodeAt(i) > 255 ? 2 : 1; 
    } 
    return len; 
} 

Nhờ tất cả những gì đã cố gắng để giúp đỡ!

+0

Ai biết rằng các ký tự đa byte được mã hóa bằng cách sử dụng 3 byte ?! Lần đầu tiên tôi nghe về nó .. –

+0

@PP Tất nhiên là không chính xác và chức năng này sẽ chỉ hoạt động đối với các ký tự hỗn hợp trong phạm vi 0-127 hoặc trong một bộ ký tự không vừa với hai ký tự. Tôi thực sự điều @ TheOnly92 nên giải quyết nó đúng để thay thế. – Fredrik

+0

-1. 'ç' mất 2 byte trong UTF-8. – kennytm

4

Nếu bạn đang cố gắng để có được độ dài của một UTF-8 chuỗi mã hóa trong PHP, bạn nên xác định mã hóa trong tham số thứ hai của mb_strlen, như vậy:

mb_strlen($_POST['text'], 'UTF-8') 

Ngoài ra, không quên gọi stripslashes trên POST-var.

0

này nên làm các trick

function mb_strlen (s) { 
    return ~-encodeURI(s).split(/%..|./).length; 
} 
Các vấn đề liên quan