2013-06-11 22 views
6

Tôi đang gặp sự cố với mã hóa UTF-8 khi đăng dữ liệu biểu mẫu dưới dạng "multipart/form-data", mà không có dữ liệu đa dạng/biểu mẫu hoạt động tốt. Nhưng kể từ khi tôi phải tải lên các tập tin trên cùng một bài, tôi cần phải sử dụng multipart/form-data.PHP 5.4 multipart/form-data Mã hóa UTF-8

Sự cố được bắt đầu sau khi nâng cấp từ PHP 5.3.x lên PHP 5.4.4-14 (đi kèm với Debian Wheezy), các tập lệnh giống nhau hoạt động tốt với máy chủ thử nghiệm PHP 5.3.

  • Tất cả tài liệu của tôi được lưu trong UTF-8 và có <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> thẻ.
  • Tôi đã thử nghiệm với các trình duyệt khác nhau trên máy tính khác nhau
  • mb_detect_encoding() phát hiện chuỗi được đăng là UTF-8
  • tôi đã cố gắng AddDefaultCharset utf-8 cho cấu hình Apache.

Ở đây bạn có thể kiểm tra kịch bản của tôi, bạn có thể sao chép/dán sau chuỗi với các nhân vật Thổ Nhĩ Kỳ (ví dụ chuỗi:. Öçşipğopüp)

http://sa.chelona.com.tr/haber-ekle.html

Tôi cũng thấy câu hỏi có liên quan tại UTF-8 text is garbled when form is posted as multipart/form-data in PHP nhưng nó khuyến cáo tái cài đặt apache/php và điều đó là không thể cho tình huống của tôi. Đây có phải là lỗi PHP/Apache đã biết không?

Trả lời

3

Tôi viết thư này để trả lời câu hỏi của riêng tôi ... Tôi hy vọng nó sẽ giúp người khác ...

nếu bạn sử dụng PHP 5.4. x, thiết lập mbstring.http_input từ "auto" thành "pass" có thể giải quyết vấn đề của bạn.

5

Thực hiện chuyển đổi đơn giản từ UTF-8 để Turkish Alphabet ISO-8859-9 và vấn đề cần được giải quyết

iconv('UTF-8', "ISO-8859-9", $string); 

Example Input: öçşipğopüp

Ví dụ mẫu:

<form method="post" enctype="multipart/form-data" action ="self.php"> 
<input type="text" name="hello" /> 
<input type="submit" name="test" /> 
</form> 

Simple bể phốt:

var_dump($_POST['hello'],iconv('UTF-8', "ISO-8859-9", $_POST['hello'])); 

Output

string 'öçşipğopüp ' (length=16) 
string 'öçþipðopüp ' (length=11) 
+0

Cảm ơn bạn đã trả lời nhưng dữ liệu sẽ được chèn vào bảng MySQL với bảng mã UTF-8, do đó chuyển đổi nó thành ISO-8859-9 sẽ là một vấn đề khác. –

0

bạn nên cố gắng để cài đặt lại wamp hay xampp hoặc apache của bạn và php.and chạy mã của bạn trên máy tính của một số ai khác với phiên bản php cùng .Nếu mã này chạy sau đó thử để tìm ra lý do tại sao nó không hoạt động trong máy chủ của bạn hoặc kiểm tra phần mở rộng file_upload trong php của bạn.

0

nếu bỏ ghi chú dòng ký tự mặc định trong php.ini thực hiện điều gì đó, ot sẽ dễ sửa. nhớ để thoát apache sau khi thay đổi.

0

Tôi không nghĩ bạn nên sử dụng mb_detect_encoding để xác định mã hóa trong trường hợp này.

Nếu bạn phải sử dụng nó, thì có lẽ bạn cần phải thiết lập thứ tự phát hiện để đảm bảo UTF-8 là cao lên danh sách, xem http://www.php.net/manual/en/function.mb-detect-order.php

Bạn đã thiết lập của hình thức chấp nhận-charset UTF-8 ; bạn đã đặt trang gốc thành UTF-8: tất cả các trình duyệt hiện tại sẽ gửi UTF-8. HTML 5 chỉ định FWIW này: http://www.w3.org/TR/2011/WD-html5-20110405/association-of-controls-and-forms.html#multipart-form-data

Chuỗi sẽ là UTF-8, không thử chuyển đổi, và bạn sẽ ổn.

Nhưng nếu bạn gửi một số mã PHP của bạn thì có lẽ nó sẽ được rõ ràng những gì bạn đang cố gắng làm và những gì đang xảy ra sai ...

0

Xin lỗi đây là chi tiết của một ý tưởng cho một workaround hơn giải pháp thực tế , tuy nhiên nếu tất cả các phương pháp truyền thống đã thất bại, và bạn không thể cài đặt lại bất cứ điều gì, hãy thử chuyển đổi từ các điểm mã UTF8. Một cái gì đó giống như sử dụng một mã hóa base64 trước khi gửi và sau đó giải mã khi nhận được. Hoặc chuyển đổi thành chuỗi thập lục phân và giải mã sau khi nhận.

0

Bạn cần thêm tiêu đề trong PHP và HTML, giống như chữ thường:

<?php header('content-type: text/html; charset=utf-8'); ?> 
    <html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    </head> 
    <body> 
    <form method="post" enctype="multipart/form-data" action ="self.php"> 
     ... 
    </form> 
    </body> 
    </html> 

Hãy nhớ rằng: Lưu tất cả các file php và html trong utf-8 Without BOM.

0

Trang mẫu của bạn có vẻ chính xác và các bước bạn đã thực hiện dường như bao gồm hầu hết các điểm quan trọng, có một điều nữa tôi sẽ kiểm tra. Bạn đã viết rằng dữ liệu được lưu trữ trong một cơ sở dữ liệu MySql với bộ mã UTF-8, nhưng điều này không nhất thiết có nghĩa là, đối tượng kết nối PHP cũng làm việc với bộ ký tự này.

// tells the mysqli connection to deliver UTF-8 encoded strings. 
$db = new mysqli($dbHost, $dbUser, $dbPassword, $dbName); 
$db->set_charset('utf8'); 

// tells the pdo connection to deliver UTF-8 encoded strings. 
$dsn = "mysql:host=$dbHost;dbname=$dbName;charset=utf8"; 
$db = new PDO($dsn, $dbUser, $dbPassword); 

Ví dụ ở trên cho biết cách đặt bộ ký tự cho SQLI hoặc PDO. Chuẩn bị đối tượng kết nối theo cách này, làm cho bạn độc lập với cấu hình cơ sở dữ liệu, nếu cần thiết kết nối thậm chí sẽ chuyển đổi dữ liệu trả về/gửi đi.

Để kiểm tra điều này trong trang của bạn, hãy đảm bảo rằng bộ ký tự được đặt trước khi chèn/truy vấn cơ sở dữ liệu.

0

mb_internal_encoding ("UTF-8");

Thêm mã này trước khi chuỗi của bạn ..

0

Sau một thời gian dài cố gắng giải nén() và các đề xuất từ ​​các câu trả lời ở đây, tôi đã tìm thấy một cạm bẫy, và có thể bạn có cùng lý do cho vấn đề mã hóa.

Tất cả tôi phải làm đã làm htmlentities sử dụng utf-8 một cách rõ ràng:

htmlentities(stripslashes(trim(rtrim($_POST['title']))), ENT_COMPAT, "utf-8"); 

này là dành cho php 5.2.xx

1

phiên bản php của tôi là 5.4.45 và thay đổi mbstring.http_input từ auto để pass hoạt động rất tốt. Trong php.ini tệp giá trị mặc định là vượt qua. Để biết thêm chi tiết về biến này, bạn có thể xem here.