2012-10-05 31 views
5

Tôi có đoạn mã sau:Tại sao mb_convert_case trong PHP 5.4 phá vỡ chuỗi của tôi, khi ở 5.2 nó không?

header('Content-type: text/html; charset=utf-8'); 
$str = 'áá áá'; 
echo $str."\n"; 
echo mb_convert_case($str, MB_CASE_TITLE)."\n"; 
echo bin2hex($str)."\n"; 
echo bin2hex(mb_convert_case($str, MB_CASE_TITLE))."\n"; 

Sử dụng PHP 5.2.2, tôi nhận được kết quả như sau:

áá áá 
áá áá 
c3a1c3a120c3a1c3a1 
c3a1c3a120c3a1c3a1 

Sử dụng PHP 5.4.3, tôi có được điều này:

áá áá 
á� á� 
c3a1c3a120c3a1c3a1 
c3a1e3a120c3a1e3a1 

Sản lượng dự kiến ​​của tôi trong cả hai trường hợp sẽ là:

áá áá 
Áá Áá 
c3a1c3a120c3a1c3a1 
c381c3a120c381c3a1 

Vì vậy, tôi có hai câu hỏi:

  1. Tại sao không được chuyển đổi sang Á?
  2. Tại sao PHP 5.4 phá vỡ chuỗi của tôi?
+4

Không thể trả lời cụ thể câu hỏi của bạn, nhưng cố gắng chuyển tham số '$ encoding' thành' mb_convert_case' một cách rõ ràng. – deceze

+0

Tôi cũng đề xuất những gì @deceze nhận xét. thêm tham số mã hóa rõ ràng. cũng kiểm tra mã hóa mặc định của bạn cho chuỗi mb. mã hóa nào là tệp trong? – hakre

Trả lời

6

Hoặc vượt qua trong $encoding cho mọi cuộc gọi đến mb_ chức năng, hoặc thiết lập:

mb_internal_encoding("UTF-8"); 

để đảm bảo PHP biết những gì mã hóa, bạn đang sử dụng. Nếu không, mã hóa sẽ xuất phát từ php.ini hoặc ISO-8859-1 mặc định nếu không được bao gồm.

Vì vậy, cài đặt 5.4 của bạn là mặc định thành ISO-8859-1 và do đó giảm bớt byte chì của chuỗi UTF-8, hãy phá vỡ nó. Điều tương tự cũng xảy ra với tôi trong 5.2, vì vậy có thể có điều gì đó khác về cài đặt 5.2 của bạn khác - có lẽ internal_encoding trong số ini được đặt thành một thứ khác không có chữ cái trong các vị trí byte đó?

+0

Ah, tất nhiên, tôi đặt tiêu đề mã hóa HTTP, nhưng internal_encoding của tôi không được đặt! Theo phpinfo của PHP 5.2(), thiết lập mbstring.internal_encoding của tôi là ISO-8859-1, trong khi trong cấu hình PHP 5.4 của tôi, nó không được đặt ở tất cả ("không có giá trị"). Điều thú vị là, 5.4 dường như mặc định là ISO-8859-1 như bạn đã đề xuất (một cuộc gọi đến mb_internal_encoding() mà không có tham số nào xác nhận điều này) nhưng đầu ra khác nhau giữa hai phiên bản. Bất kể, thiết lập rõ ràng mbstring.internal_encoding thành UTF-8 giải quyết vấn đề trong cả hai phiên bản. Cảm ơn bạn đã giúp đỡ! – Alex

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