2009-09-08 17 views
9

json_encode() sẽ không hoạt động đối với tôi khi tôi đang sử dụng åäö. Tại sao? Và làm thế nào tôi có thể làm cho nó hoạt động?Cách lấy json_encode() để làm việc với ISO-8859-1 (åäö)

Các php:

echo json_encode($arr); 

Các javascript:

var theResponse = JSON.parse(xmlHttp.responseText); 

Khi tôi alert() phản ứng, và phản ứng có chứa A, một hoặc ö, phản ứng là = NULL

Hãy , hãy giúp tôi ...

+0

Bạn nhận được kết quả gì?Bạn đang sử dụng thư viện JSON nào? –

+0

Đầu ra là 'NULL' nếu nó chứa å, ä hoặc ö. Thư viện JSON là http://www.JSON.org/json2.js – Johan

+3

Bạn đang sử dụng phiên bản PHP nào? Tôi tin rằng các phiên bản đầu tiên của 'json_encode()' chỉ xử lý các chuỗi UTF-8 đúng cách. Hãy thử 'utf8_encode'-ing chuỗi trước khi mã hóa và xem có hoạt động hay không. –

Trả lời

7

Như Greg đã đề cập, tôi phải mã hóa åäö thành UTF-8. Nhưng tôi đã không sử dụng iconv hoặc mbstring. Khi tôi utf8_encode() tất cả các giá trị trước khi đặt giá trị cho array sự cố đã được giải quyết.

+1

Tôi đang đối mặt với một vấn đề tương tự, nơi tôi có một mảng liên kết cần được mã hóa. Tôi đã thử 'array_walk_recursive()' với 'if (is_string ($ input)) {return utf_encode ($ input); } else {return $ input} 'để gọi lại nhưng điều đó dường như không hoạt động. Bất kỳ ý tưởng? – Anticom

+0

@Anticom giải pháp của tôi bên dưới sắp xếp điều đó. –

11

Nó nói trong số json_encode() documentation:

Chức năng này chỉ hoạt động với dữ liệu được mã hóa UTF-8.

Bạn nên chuyển đổi nó thành utf-8 với iconv hoặc mbstring trước tiên.

0

Sử dụng phương pháp tiêu chuẩn khi đọc từ MySQL:

$resultArray = array(); 
while($obj = MySQL_fetch_object($res)) { 
$resultArray[] = $obj; 
} 
$result = json_encode($resultArray); 

Các mã hóa có thể được thực hiện bằng cách sử dụng sau đây:

$resultArray = array(); 
while($obj = MySQL_fetch_object($res)) { 
foreach($obj as $key => $value) { 
    if (!is_null($value)) { 
    $obj->$key = utf8_encode($value); 
    } 
} 
$resultArray[] = $obj; 
} 
$result = json_encode($resultArray); 

Các if is_null phải được bao gồm để lĩnh vực null (ví dụ, DateTime lĩnh vực) vẫn còn null trong đầu ra.

2

JSON định nghĩa chuỗi là Unicode!

JSON Definition

Bạn cần phải mã hóa bạn ISO sang UTF-8

0

Các $data (trong trường hợp của tôi) là một mảng với các giá trị văn bản như ISO-8859-1. Bí quyết dưới đây chuẩn bị $data để sử dụng với json_encode.

function toUtf8(&$v, $k) { 
    $v = utf8_encode($v); 
} 
array_walk_recursive($data, 'toUtf8'); 
4

Chức năng này sẽ truyền kiểu dữ liệu chính xác cho đầu ra JSON và utf8_encode các chuỗi.

/* Change data-type from string to integar or float if required. 
    * If string detected then utf8_encode() it. */ 
    function cast_data_types ($value) { 
     if (is_array($value)) { 
     $value = array_map('cast_data_types',$value); 
     return $value; 
     } 
     if (is_numeric($value)) { 
     if(strpos('.', $value)===false) return (float)$value; 
     return (int) $value; 
     } 
     return utf8_encode((string)$value); 
    } 

json_encode (cast_data_types($data)); 
+0

Đã làm việc trong trường hợp của tôi. Cảm ơn. – plocks

0

Câu hỏi cũ, nhưng tôi đã đặt ở đây trong trường hợp ai đó cần ghi dữ liệu bằng cách sử dụng json_encode nhưng giữ nguyên dữ liệu, nguyên vẹn để kiểm tra sau.

Bạn có thể mã hóa dữ liệu thô bằng cách sử dụng base64_encode, sau đó nó sẽ hoạt động với json_encode. Sau đó, sau khi chạy json_decode, bạn có thể giải mã chuỗi bằng base64_decode, bạn sẽ nhận được dữ liệu gốc chưa được sửa đổi.

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