Displaying UNICODE characters in JSON

2019-09-21 04:00发布

问题:

I'm trying to display Amharic characters which are utf-8 character in a ListView in my android app, but what appears is series of question marks ????? This is what the json output looks like:

[{"ImageID":"1","ItemID":" Michael","ItemID_AM":" ???","ImagePath":"http:\/\/10.0.2.2
    \/android\/Pagination\/pics\/pic_a.png"},{"ImageID":"2","ItemID":" Mary","ItemID_AM":" 
    ????","ImagePath":"http:\/\/10.0.2.2\/android\/Pagination\/pics\/pic_b.png"},
    {"ImageID":"3","ItemID":"Sarah","ItemID_AM":"????","ImagePath":"http:\/\/10.0.2.2\/android
    \/Pagination\/pics\/pic_c.png"},
    {"ImageID":"4","ItemID":"John","ItemID_AM":"??","ImagePath":"http:\/\/10.0.2.2\/android
    \/Pagination\/pics\/pic_d.png"},
    {"ImageID":"5","ItemID":"Paul","ItemID_AM":"???","ImagePath":"http:\/\/10.0.2.2\/android
    \/Pagination\/pics\/pic_e.png"},
    {"ImageID":"6","ItemID":"Martha","ItemID_AM":"??????","ImagePath":"http:\/\/10.0.2.2
    \/android\/Pagination\/pics\/pic_f.png"},
    {"ImageID":"7","ItemID":"Abby","ItemID_AM":"??","ImagePath":"http:\/\/10.0.2.2\/android
    \/Pagination\/pics\/pic_a.png"},
    {"ImageID":"8","ItemID":"Bekei","ItemID_AM":"??","ImagePath":"http:\/\/10.0.2.2\/android
    \/Pagination\/pics\/pic_b.png"},
    {"ImageID":"9","ItemID":"Nani","ItemID_AM":"??","ImagePath":"http:\/\/10.0.2.2\/android
    \/Pagination\/pics\/pic_c.png"},
    {"ImageID":"10","ItemID":"Baby","ItemID_AM":"??","ImagePath":"http:\/\/10.0.2.2\/android
    \/Pagination\/pics\/pic_d.png"},
    {"ImageID":"11","ItemID":"Made","ItemID_AM":"???","ImagePath":"http:\/\/10.0.2.2\/android
    \/Pagination\/pics\/pic_e.png"},
    {"ImageID":"12","ItemID":"Fuche","ItemID_AM":"??","ImagePath":"http:\/\/10.0.2.2\/android
    \/Pagination\/pics\/pic_f.png"},{"ImageID":"13","ItemID":"Michael Fulle","ItemID_AM":"???
     ??","ImagePath":"http:\/\/10.0.2.2\/android\/Pagination\/pics\/pic_a.png"},
    {"ImageID":"14","ItemID":" Mary Assefa","ItemID_AM":"???? ???","ImagePath":"http:\/
    \/10.0.2.2\/android\/Pagination\/pics\/pic_b.png"},{"ImageID":"15","ItemID":"Sarah 
Michael","ItemID_AM":"???? ???","ImagePath":"http:\/\/10.0.2.2\/android\/Pagination\/pics\/pic_c.png"},{"ImageID":"16","ItemID":"John Michael","ItemID_AM":"?? 
    ???","ImagePath":"http:\/\/10.0.2.2\/android\/Pagination\/pics\/pic_d.png"},
    {"ImageID":"17","ItemID":"Paul Michael","ItemID_AM":"??? ???","ImagePath":"http:\/
    \/10.0.2.2\/android\/Pagination\/pics\/pic_e.png"},{"ImageID":"18","ItemID":"Martha 
    Ephrem","ItemID_AM":"?????? ????","ImagePath":"http:\/\/10.0.2.2\/android\/Pagination\/pics
    \/pic_f.png"},{"ImageID":"19","ItemID":"Item 19","ItemID_AM":"?? 19","ImagePath":"http:\/
    \/10.0.2.2\/android\/Pagination\/pics\/pic_h.png"},{"ImageID":"20","ItemID":"Item 
    20","ItemID_AM":"?? 20","ImagePath":""},{"ImageID":"21","ItemID":"Item 21","ItemID_AM":"??
     21","ImagePath":"http:\/\/10.0.2.2\/android\/Pagination\/pics\/pic_g.png"}]

ItemID_AM is a field name in my database which stores the Amharic characters, and in my db it clearly displays the Amharic characters. Which are Phonetic UNICODE.

here is mydatabase

    CREATE TABLE `images2` (
    `ImageID` int(2) NOT NULL auto_increment,
    `ItemID` varchar(50) NOT NULL,
    `ItemID_AM` varchar(50) NOT NULL,
    `ImagePath` varchar(50) NOT NULL,
    PRIMARY KEY (`ImageID`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=31 ;

    -- 
    -- Dumping data for table `images2`
    -- 

    INSERT INTO `images` VALUES (1, 'Michael', '???', 'http://10.0.2.2/android/Pagination/pics/pic_a.png');
    INSERT INTO `images` VALUES (2, 'Mary', '????', 'http://10.0.2.2/android/Pagination/pics/pic_b.png');
    INSERT INTO `images` VALUES (3, 'Sarah', '????', 'http://10.0.2.2/android/Pagination/pics/pic_c.png');
    INSERT INTO `images` VALUES (4, 'John', '??', 'http://10.0.2.2/android/Pagination/pics/pic_d.png');
    INSERT INTO `images` VALUES (5, 'Paul', '???', 'http://10.0.2.2/android/Pagination/pics/pic_e.png');
    INSERT INTO `images` VALUES (6, 'Martha', '??????', 'http://10.0.2.2/android/Pagination/pics/pic_f.png');

here is my getAllData.php

<?php
$host = "localhost"; // host of MySQL server
$user = "root"; // MySQL user
$pwd = ""; // MySQL user's password
$db = "mydatabase"; // database name

header('content-type: application/json; charset=utf-8');

// Create connection
$con = mysqli_connect($host, $user, $pwd, $db);

// Check connection
if(mysqli_connect_errno($con)) {
    die("Failed to connect to MySQL: " . mysqli_connect_error());
} 

// query the application data
$sql = "SELECT * FROM images2 WHERE 1 ";
$result = mysqli_query($con, $sql);


// an array to save the application data
$rows = array();

// iterate to query result and add every rows into array
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    $rows[] = $row; 
}

// close the database connection
mysqli_close($con);


// echo the application data in json format
echo json_encode($rows);
?>

I already used: header('content-type: application/json; charset=utf-8'); But nothing changed. Can someone F1 please, please, please?

回答1:

You've already confirmed in Encoding JSON to support UTF-8 characters in an android app that in a regular browser, you get question marks too. This indicates that the problem is server side.

The issue is probably that the database connection from PHP to MySQL is not set to UTF-8. During the response, any non-ISO8895-1 chars will be converted to "?".

Set the character set on the connection with:

mysqli_set_charset($con, "utf8")

before you issue the select.