2011-01-25 31 views
24

Tôi vẫn không hiểu cách hoạt động của iconv.PHP: Xử lý các ký tự đặc biệt với biểu tượng

Ví dụ,

$string = "Löic & René"; 
$output = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string); 

tôi nhận được,

Chú ý: iconv() [function.iconv]: phát hiện một nhân vật bất hợp pháp ở đầu vào chuỗi trong ...

$string = "Löic"; hoặc $string = "René";

tôi nhận được,

Thông báo:. iconv() [function.iconv]: phát hiện một ký tự multibyte không đầy đủ trong chuỗi đầu vào trong

Tôi nhận được gì với $string = "&";

Có hai bộ đầu ra khác nhau tôi cần lưu trữ chúng trong hai khác nhau cột bên trong bảng cơ sở dữ liệu của tôi,

  1. tôi cần phải chuyển đổi Löic & René để Loic & Rene cho url sạch pu đề xuất.

  2. Tôi cần giữ chúng như cũ - Löic & René dưới dạng Löic & René sau đó chỉ chuyển đổi chúng với htmlentities($string, ENT_QUOTES); khi hiển thị chúng trên trang html của tôi.

Tôi đã thử với một số gợi ý trong php.net dưới đây, nhưng vẫn không hiệu quả,

tôi đã có một tình huống mà tôi cần một số ký tự phiên âm, nhưng những người khác bỏ qua (cho dấu lạ như Ayn hoặc hamza). Thêm // TRANSLIT // IGNORE dường như làm thủ thuật cho tôi. Nó chuyển ngữ tất cả mọi thứ có thể được chuyển ngữ, nhưng sau đó ném ra những thứ không thể.

Vì vậy:

$string = "ʿABBĀSĀBĀD"; 

echo iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $string); 
// output: [nothing, and you get a notice] 

echo iconv('UTF-8', 'ISO-8859-1//IGNORE', $string); 
// output: ABBSBD 

echo iconv('UTF-8', 'ISO-8859-1//TRANSLIT//IGNORE', $string); 
// output: ABBASABAD 
// Yay! That's what I wanted! 

và khác,

Andries Seutens 07-Nov-2009 07:38 
When doing transliteration, you have to make sure that your LC_COLLATE is properly set, otherwise the default POSIX will be used. 

To transform "rené" into "rene" we could use the following code snippet: 
setlocale(LC_CTYPE, 'nl_BE.utf8'); 

$string = 'rené'; 
$string = iconv('UTF-8', 'ASCII//TRANSLIT', $string); 

echo $string; // outputs rene 

Làm thế nào tôi có thể thực sự làm việc chúng ra?

Cảm ơn.

EDIT:

Đây là tập tin nguồn tôi thử nghiệm mã,

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" class="no-js"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
</head> 
<?php 
$string = "Löic & René"; 
$output = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string); 
?> 
</html> 
+0

BTW: bạn nhận ra 'ö' &' é' nằm trong ISO-8859-1 không?Ngoài bộ ký tự đầu vào không đúng, bạn có thể muốn thay đổi bộ ký tự đầu ra của mình thành 'ASCII // TRANSLIT'. – Wrikken

+7

Tôi rất bối rối với các bộ ký tự này ... – laukok

+1

Cảm ơn! Tôi đã phải giải mã một số ký tự tiếng Hàn thành UTF-8 và đó là một cơn đau đầu thực sự - cuối cùng, điều duy nhất đã giúp là: '$ conversion = iconv ('EUC-KR', 'UTF-8 // TRANSLIT', $ – ShayLivyatan

Trả lời

12

Và bạn đã lưu tập tin nguồn của bạn trong mã UTF-8? Nếu không (và tôi đoán bạn đã không kể từ đó sẽ tạo ra "nhân vật multibyte không đầy đủ" lỗi), sau đó thử đầu tiên.

+0

Hầu hết là câu trả lời (hoặc nếu các chuỗi không có nguồn gốc trong tệp/a, bộ ký tự không đúng cho bất kỳ nguồn nào (db, http, vv) của dữ liệu. không phải là utf-8 – Wrikken

+0

@wimvds: cảm ơn tôi làm cách nào để lưu tệp nguồn bằng mã hóa UTF-8? Vui lòng xem chỉnh sửa của tôi ở trên - Tôi có utf-8 trong meta meta của mình - có đúng không? – laukok

+0

@lauthiamkok: Nếu bạn vẫn đang thử nghiệm các ví dụ trên thì hãy sử dụng trình soạn thảo/IDE tốt cho phép bạn chọn mã hóa tệp (Ví dụ: Notepad ++ trên Windows, Eclipse/NetBeans trên bất kỳ hệ điều hành chính nào) .Đối với đầu vào từ các trang web, bạn nên sử dụng thẻ meta hoặc các cuộc gọi Tiêu đề có liên quan (hoặc tốt nhất là cả hai) và khi sử dụng MySQL, hãy đảm bảo rằng bạn cũng mở nó trong chế độ UTF-8 ('SET NAMES 'utf-8''). – wimvds

18
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', utf8_encode($s)); 
+3

+1, 'utf8_encode()' một mình đã làm việc tốt cho tôi, cảm ơn! – John

+8

Lưu ý rằng 'utf8_encode()' sẽ chỉ chuyển đổi ISO-8859-1 thành UTF-8 –

+1

Đoạn mã lớn. Tôi đã gặp phải thông báo trong chuyển đổi tên tệp và giải pháp này đã giải quyết được vấn đề của tôi. – Giorgio

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