2009-09-07 28 views
5

Tôi muốn đầu ra các chuỗi sau đây trong PHP:Encoding vấn đề (UTF-8) trong PHP

ä ö ü ß €

Vì vậy, tôi đã mã hóa nó để UTF8 bằng tay:

ä ö ¼ AY Â

Vì vậy, kịch bản của tôi là:

<?php 
header('content-type: text/html; charset=utf-8'); 
echo 'ä ö ü ß €'; 
?> 

4 ký tự đầu tiên là chính xác (ö ü ß) nhưng tiếc là dấu € là không đúng:

ä ö ü ß

Here you can see it.

Bạn có thể cho tôi biết những gì tôi đã làm sai? Trình soạn thảo của tôi (Notepad ++) có các cài đặt cho Mã hóa (Ansi/UTF-8) và Định dạng (Windows/Unix). Tôi có phải thay đổi chúng không?

Tôi hy vọng bạn có thể giúp tôi. Cảm ơn trước!

+3

Bạn nên sử dụng một trình soạn thảo hỗ trợ UTF-8. Những gì bạn đã làm là chỉ sử dụng ISO 8859-1 để viết các từ mã của UTF-8. Sử dụng UTF-8 bạn có thể viết trực tiếp 'ä ö ü ß € '. – Gumbo

+1

Ah, xin lỗi, đó là Windows-1252 thay vì ISO 8895-1 – Gumbo

+0

Cẩn thận, mặc dù, sử dụng UTF-8 có thể chèn U + FEFF vào đầu tệp. Và PHP không thích điều đó chút nào. – Joey

Trả lời

8

Ký tự cuối cùng đó không có trong tệp (hãy thử xem nguồn), đó là lý do bạn không nhìn thấy nó.

Tôi nghĩ bạn nên lưu tệp PHP dưới dạng UTF-8 (trong Notepad ++ tùy chọn có sẵn trong Định dạng -> Mã hóa trong UTF-8 không có BOM) và chèn các ký tự thực trong tệp PHP của bạn (ví dụ: trong Notepad ++), thay vì hack xung quanh bằng cách chèn à ở mọi nơi. Bạn có thể thấy Windows Character Map hữu ích cho việc chèn các ký tự unicode.

+0

Tại sao lại là downvote? Tôi đã có một cái gì đó sai? –

+0

Không, tôi không nghĩ vậy. Mọi thứ đều ổn. Cảm ơn bạn về mẹo với Notepad ++! – caw

5

Ký hiệu Euro (U + 20AC) được mã hóa bằng UTF-8 với ba byte, không phải hai. Điều này có thể được nhìn thấy here. Vì vậy, mã hóa của bạn chỉ đơn giản là sai.

+0

Cảm ơn, đó có vẻ là nguyên nhân. :) – caw

+1

Nó không phải là không phổ biến cho bất cứ điều gì xử lý văn bản để thả chuỗi byte không hợp lệ từ đầu vào. Vì vậy, khi bạn quảng cáo một cái gì đó như UTF-8 và bao gồm UTF-8 không hợp lệ thì không mong đợi nó ở đó. – Joey

2

Bạn nên luôn luôn đặt trình chỉnh sửa của mình thành cùng một mã hóa mà HTML được tạo ra sẽ hướng dẫn trình duyệt sử dụng. Nếu trang HTML được dự định được hiểu là UTF-8, thì hãy đặt trình soạn thảo văn bản của bạn thành UTF-8. PHP hoàn toàn không biết về các thiết lập mã hóa của trình soạn thảo được sử dụng để tạo tệp; nó xử lý các chuỗi như một luồng các byte.

Nói cách khác, miễn là byte đúng nằm trong tệp, mọi thứ sẽ hoạt động. Và cách dễ nhất để đảm bảo các byte phù hợp có trong tệp, là đặt mã hóa của bạn thành cùng một trang web được cho là đang ở. Bất kỳ điều gì khác chỉ khiến cuộc sống khó khăn hơn mức cần thiết.

Nhưng biện pháp phòng thủ tốt nhất là để lại các ký tự không phải ASCII hoàn toàn khỏi mã. Bạn có thể kéo chúng ra khỏi cơ sở dữ liệu hoặc tệp bản địa hóa thay thế. Điều này có nghĩa là mã có thể được sửa đổi về cơ bản bất kỳ trình soạn thảo nào mà không lo lắng về việc làm hỏng mã hóa.

+0

Cảm ơn bạn, tôi sẽ làm điều này trong tương lai. Nó sẽ thực sự làm cho mã hóa dễ dàng hơn. – caw

4

Nếu bạn muốn đầu ra nó đúng cách để utf8, kịch bản của bạn nên là:

<?php 
header('content-type: text/html; charset=utf-8'); 
echo "\xc3\xa4"."\xc3\xb6"."\xc3\xbc"."\xc3\x9f"."\xe2\x82\xac"; 
?> 

Bằng cách đó ngay cả khi kịch bản php của bạn sẽ được lưu vào một mã hóa phi utf8, nó vẫn sẽ làm việc.

+0

Cảm ơn. Dòng echo làm gì chính xác? – caw

+0

Nó lặp lại mỗi ký tự sau được mã hóa trong utf8: ä ö ü ß €. Trong câu hỏi ban đầu của bạn, bạn đã nói "Tôi đã mã hóa nó thành utf8 theo cách thủ công". Để thực sự làm điều đó, hãy vào http://www.utf8-chartable.de/ và tìm kiếm ä, bạn sẽ thấy trong utf8 nó là "\ xc3 \ xa4"; – velcrow

0
header('Content-Type: text/html; charset=UTF-8'); 

Điều này chỉ thông báo cho trình duyệt loại nội dung bạn sẽ gửi và cách xử lý nội dung đó. Nó không đặt mã hóa của nội dung thực tế bạn đang gửi. Nó hoàn toàn tùy thuộc vào bạn để thực hiện lời hứa của riêng bạn.Nội dung của bạn sẽ không biến đổi một cách kỳ diệu từ bất cứ điều gì thành UTF-8 chỉ vì bạn đã đặt tiêu đề đó. Nếu bạn yêu cầu trình duyệt xử lý nội dung dưới dạng UTF-8, nhưng bạn đang gửi dữ liệu được mã hóa Latin-1, tất nhiên nó sẽ bị hỏng.

tôi giới thiệu bạn đến What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text

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