2011-10-28 26 views
5

Tôi hiện đang cố gắng xóa tất cả ký tự đặc biệt và dấu trọng âm khỏi chuỗi UTF-8 bằng cách chuyển chúng thành ký tự ASCII tương đương nếu có thể.Tại sao biểu tượng của PHP lại cần setlocale?

Vì vậy, tôi chỉ đơn giản là sử dụng mã này:

$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input); 

Vấn đề là ví dụ từ "đầu tay" biến thành "dbut" thay cho "ra mắt". Để làm cho nó làm việc, tôi cần thêm một cuộc gọi đến setlocale, như thế này:

setlocale(LC_ALL, 'en_US.UTF8'); 
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input); 

Và tôi không hiểu tại sao. Tôi nghĩ UTF-8 và ASCII luôn giống nhau, bất kỳ ngôn ngữ nào bạn sử dụng.

EDIT: Tôi không có ý UTF-8 bằng ASCII, tôi có nghĩa là UTF-8 luôn bằng UTF-8 và ASCII luôn bằng ASCII

+0

ASCII và UTF-8 aint giống nhau. UTF-8 lớn hơn theo thứ tự độ lớn. – NikiC

Trả lời

1

Các tập hợp con của UTF-8 mà trùng với ASCII (mà là mã điểm 0-127) thực sự giống hệt với ASCII. Tuy nhiên, ký tự latin có dấu không phải là một phần của bộ ký tự ASCII và nếu bạn không tự mình là setlocale, ngôn ngữ mặc định của hệ thống (hiển nhiên không chứa các ký tự có dấu) này được sử dụng để đặt ký tự làm việc.

Nói chung, iconv có thể hơi khó chịu; điều này được đề cập trong phần mở rộng introduction của tiện ích mở rộng:

Mô-đun này chứa giao diện để chuyển đổi bộ ký tự iconv . Với mô-đun này, bạn có thể biến một chuỗi được biểu thị bằng một ký tự địa phương là được đặt trong bộ ký tự đại diện bởi có thể là bộ ký tự Unicode. Các bộ ký tự được hỗ trợ phụ thuộc vào việc thực hiện biểu tượng của hệ thống của bạn. Lưu ý rằng chức năng iconv trên một số hệ thống có thể không hoạt động như bạn mong đợi. Trong trường hợp này, bạn nên cài đặt thư viện libiconv GNU. Nó sẽ nhiều khả năng sẽ có kết quả nhất quán hơn.

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