2008-12-17 46 views
38

Một số tập lệnh của tôi đang sử dụng mã hóa khác nhau và khi tôi cố gắng kết hợp chúng, điều này có vấn đề.Chuyển đổi các ký tự utf8 thành iso-88591 và ngược lại trong PHP

Nhưng tôi không thể thay đổi mã hóa mà họ sử dụng, thay vào đó tôi muốn thay đổi encodig của kết quả từ kịch bản A, và sử dụng nó như là tham số trong kịch bản B.

Vì vậy: là có cách nào đơn giản để thay đổi một chuỗi từ UTF-8 thành ISO-88591 bằng PHP? Tôi đã nhìn vào utf_encode và _decode, nhưng họ không làm những gì tôi muốn. Tại sao không tồn tại bất kỳ "utf2iso()" - chức năng, hoặc tương tự?

Tôi không nghĩ rằng mình có các ký tự không thể được ghi ở định dạng ISO, do đó, đó không phải là vấn đề lớn.

+1

utf8_decode chính xác là utf2iso của bạn?!? – BlaM

+0

Cần lưu ý rằng PHP tiếp tục chuyển sang utf-8 nội bộ để bất kỳ chuỗi nào bạn có thể đến từ bên ngoài. Đặt cURL, các hàm truy cập tệp, luồng, PDO/MySQL hoặc bất kỳ API nào khác để truy cập dữ liệu bên ngoài để sử dụng UTF-8 sao cho nó sẽ đúng khi PHP nhận được. – Xeoncross

Trả lời

100

Hãy xem iconv() hoặc mb_convert_encoding(). Bằng cách này: tại sao không utf8_encode()utf8_decode() phù hợp với bạn?

utf8_decode - Chuyển đổi một chuỗi với ký tự ISO-8859-1 mã hóa với UTF-8 single-byte ISO-8859-1

utf8_encode - Mã hóa một tiêu chuẩn ISO-8859- 1 chuỗi UTF-8

Vì vậy, về cơ bản

$utf8 = 'ÄÖÜ'; // file must be UTF-8 encoded 
$iso88591_1 = utf8_decode($utf8); 
$iso88591_2 = iconv('UTF-8', 'ISO-8859-1', $utf8); 
$iso88591_2 = mb_convert_encoding($utf8, 'ISO-8859-1', 'UTF-8'); 

$iso88591 = 'ÄÖÜ'; // file must be ISO-8859-1 encoded 
$utf8_1 = utf8_encode($iso88591); 
$utf8_2 = iconv('ISO-8859-1', 'UTF-8', $iso88591); 
$utf8_2 = mb_convert_encoding($iso88591, 'UTF-8', 'ISO-8859-1'); 

tất cả phải làm tương tự - với utf8_en/decode() không yêu cầu tiện ích đặc biệt, mb_convert_encoding() yêu cầu ext/mbstring và iconv() yêu cầu ext/iconv.

+0

Cảm ơn bạn đã có câu trả lời hay, và bạn và những người khác ở đây là đúng: utf8_decode() dường như hoàn thành công việc. Đã có một số vấn đề với tệp hoặc trình duyệt của tôi. Ít nhất tôi không thể tái tạo các lỗi ... (Có lẽ tôi đã làm điều gì đó sai với trình duyệt-bộ ký tự-cài đặt của tôi?) – qualbeen

+0

Chỉ cần cho hồ sơ: Tôi đã phải đối mặt với một số tình huống như thế, nhưng tôi đã nhận thấy biểu tượng đã được gọi hai lần (lồng nhau) với cùng một var var. Sau khi tôi xóa cuộc gọi đầu tiên đó, hoạt động như một sự quyến rũ. (utf8_decode và mb_convert_enconding chưa được sử dụng) – colares

+0

Lời khuyên này đã giúp tôi giải quyết một vấn đề đặc biệt khi một chuỗi UTF-8 ("Atlántico") đầu tiên được mã hóa thành ISO-8859-1 (trông giống như "Atlántico") và sau đó các ký tự một byte này được mã hóa lại thành UTF-8 (trông giống hệt "Atlántico" nhưng mỗi ký tự UTF-8 được mã hóa lần này). utf8_decode() đã giúp bởi vì nó giải mã các ký tự UTF-8 thành các thay thế ANSI theo nghĩa đen của chúng, sau đó được đọc và hiển thị đúng cách một cách bí ẩn dưới dạng ký tự UTF-8. Liệu nó có ý nghĩa hay không? Hmm .. – Tyler

0

Bạn cần sử dụng gói iconv, cụ thể là chức năng biểu tượng của nó.

5

Trước hết, không sử dụng các mã hóa khác nhau. Nó dẫn đến một mớ hỗn độn, và UTF-8 chắc chắn là một trong những bạn nên sử dụng ở khắp mọi nơi.

Cơ hội là đầu vào của bạn không phải là ISO-8859-1, mà là một thứ khác (ISO-8859-15, Windows-1252). Để chuyển đổi từ những người này, hãy sử dụng iconv hoặc mb_convert_encoding.

Tuy nhiên, utf8_encodeutf8_decode sẽ hoạt động đối với ISO-8859-1. Sẽ thật tuyệt nếu bạn có thể đăng liên kết tới một tệp hoặc một chuỗi ví dụ uuencoded hoặc base64 mà chuyển đổi không thành công hoặc mang lại kết quả không mong muốn.

+0

biểu tượngv hoặc mb_convert_encoding? iconv yêu cầu biết mã hóa đầu vào, có thể không phải là trường hợp. – Benubird

+0

@Benubird Nếu bạn đoán mã hóa, bạn có khả năng gặp vấn đề thậm chí còn tệ hơn (hiện tại nó không dễ tái sản xuất, vì nó có thể phụ thuộc vào tần suất của các ký tự). Nhưng bạn nói đúng, 'mb_convert_encoding' chắc chắn thuộc về câu trả lời này. Thêm. – phihag

+1

"Tránh bất kỳ mã nào khác ngoài UTF8" là lời khuyên hữu ích nói chung nhưng đôi khi không thể. Ví dụ: chúng tôi đang cố gắng để tích hợp bên thứ ba hoạt động khi bên yêu cầu XML ở định dạng Latin 1. – GordonM

0

tôi đã sử dụng:

function utf8_to_html ($data) { 
    return preg_replace(
     array (
      '/ä/', 
      '/ö/', 
      '/ü/', 
      '/é/', 
      '/à/', 
      '/è/' 
     ), 
     array (
      'ä', 
      'ö', 
      'ü', 
      'é', 
      'à', 
      'è' 
     ), 
     $data 
    ); 
} 
0

tôi sử dụng chức năng này:

function formatcell($data, $num, $fill=" ") { 
    $data = trim($data); 
    $data=str_replace(chr(13),' ',$data); 
    $data=str_replace(chr(10),' ',$data); 
    // translate UTF8 to English characters 
    $data = iconv('UTF-8', 'ASCII//TRANSLIT', $data); 
    $data = preg_replace("/[\'\"\^\~\`]/i", '', $data); 


    // fill it up with spaces 
    for ($i = strlen($data); $i < $num; $i++) { 
     $data .= $fill; 
    } 
    // limit string to num characters 
    $data = substr($data, 0, $num); 

    return $data; 
} 


echo formatcell("YES UTF8 String Zürich", 25, 'x'); //YES UTF8 String Zürichxxx 
echo formatcell("NON UTF8 String Zurich", 25, 'x'); //NON UTF8 String Zurichxxx 

Kiểm tra chức năng của tôi trong blog của tôi http://www.unexpectedit.com/php/php-handling-non-english-characters-utf8

-1
function parseUtf8ToIso88591(&$string){ 
    if(!is_null($string)){ 
      $iso88591_1 = utf8_decode($string); 
      $iso88591_2 = iconv('UTF-8', 'ISO-8859-1', $string); 
      $string = mb_convert_encoding($string, 'ISO-8859-1', 'UTF-8');  
    } 
} 
+4

Vui lòng thử thêm một số giải thích cho mã để nâng cao giá trị giáo dục của bài đăng. –

1

đặt thẻ meta trong đầu như

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 

sử dụng liên kết http://www.i18nqa.com/debug/utf8-debug.html để thay thế ký tự biểu tượng bạn muốn.

sau đó sử dụng str_replace như

$find = array('“', '’', '…', '—', '–', '‘', 'é', 'Â', '•', 'Ëœ', 'â€'); // en dash 
         $replace = array('“', '’', '…', '—', '–', '‘', 'é', '', '•', '˜', '”'); 
$content = str_replace($find, $replace, $content); 

của phương pháp tôi sử dụng và giúp rất nhiều. Cảm ơn!

0

Trong trường hợp của tôi sau khi các tệp có tên chứa các ký tự đó được tải lên, chúng thậm chí không hiển thị với Filezilla! Trong Cpanel filemanager họ đã được hiển thị với? (dưới nền đen). Và sự kết hợp này đã làm cho nó hiển thị chính xác trên trình duyệt (tài liệu HTML là phương Tây được mã hóa):

$dspFileName = utf8_decode(htmlspecialchars(iconv(mb_internal_encoding(), 'utf-8', basename($thisFile['path'])))); 
0

Nó là tốt hơn để sử dụng

$ value = mb_convert_encode ($ value, 'HTML-ĐƠN VỊ' , 'UTF-8');

Đặc biệt khi bạn đang sử dụng cuộc gọi AJAX để gửi các ký tự 'ISO-8859-1'. Nó hoạt động cho tiếng Trung, tiếng Nhật, tiếng Séc, tiếng Đức và nhiều ngôn ngữ khác.

0

Sử dụng html_entity_decode()htmlentities().

$html = html_entity_decode(htmlentities($html, ENT_QUOTES, 'UTF-8'), ENT_QUOTES , 'ISO-8859-1'); 

htmlentities() định dạng đầu vào của bạn vào UTF8html_entity_decode() định dạng nó trở lại ISO-8859-1.

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