PHP:包含未找到特殊字符的数组键

时间:2012-10-24 13:55:27

标签: php arrays encoding key

我正在尝试使用带有键作为查找表的数组将字符串转换为数字。

这是数组:

$q2_10_lt = array("Full-time worker" => 1
                , "Part-time worker" => 2
                , "Unemployed, would like to work" => 3
                , "Unable to work (chronically ill/mentally handicapped/physically handicapped)" => 4
                , "Pensioner/retired" => 5
                , "Housewife/husband" => 6
                , "Student at university of college (post-matric)" => 7
                , "High school learner" => 8
                , "Primary school learner" => 9
                , "Child attending pre-school/nursery school/crèche/day-mother" => 10
                , "Child staying at home" => 11
                , "Other" => 12);

有问题的关键是“孩子上学前/托儿所/托儿所/日间母亲”。使用以下代码时找不到此密钥:

$person_tempArr[] = $q2_10_lt[$row["q2_10"]] != null ? $q2_10_lt[$row["q2_10"]] : "12";
$person_tempArr[] = $q2_10_lt[$row["q2_10"]] == null ? $row["q2_10"] : "";

$row["q2_10"]值只是从MySQL DB中获取的不同字符串。

我应该从第一行获得10号,但我得到12而完整的字符串不变“孩子上学前/托儿所/托儿所/日母”。

这必须与特殊角色è有关,但我无法解决它。请帮忙。

编辑1

按照建议进行十六进制转储后,我得到了以下结果

从SQL DB:

43 68 69 6c 64 20 61 74 74 65 6e 64 69 6e 67 20 70 72 65 2d 73 63 68 6f 6f 6c 2f 6e 75 72 73 65 72 79 20 73 63 68 6f 6f 6c 2f 63 72 e8 63 68 65 2f 64 61 79 2d 6d 6f 74 68 65 72

来自php中的字符串:

43 68 69 6c 64 20 61 74 74 65 6e 64 69 6e 67 20 70 72 65 2d 73 63 68 6f 6f 6c 2f 6e 75 72 73 65 72 79 20 73 63 68 6f 6f 6c 2f 63 72 c3 a8 63 68 65 2f 64 61 79 2d 6d 6f 74 68 65 72

差异是来自数据库的“E8”与“C3A8”或“è”与来自php字符串的“¨”。

那我怎样才能确保php字符串仍然是“è”?

2 个答案:

答案 0 :(得分:3)

从数据库层获取的字符串与用作键的字符串不同。要修复它,每次都使用相同的字符串。

这里的意思相同,字符串是逐字节的。从数据库中获取hexdump of the string

然后输入二进制字符串作为键(或至少输入特殊字母)。这将使您的代码更加健壮,因为无论您使用哪种编码保存PHP文件,它都能正常工作。

编辑: 在与数据库进行比较时,密钥需要与数据库中的二进制序列共存:

        , "Child attending pre-school/nursery school/cr\xE8che/day-mother" => 10
                                                       ^^^^

使用十六进制表示法表示您无法使用 UTF-8 编码的PHP文件“键入”的字节。该数据库使用一些 ISO-8859-1 或类似的编码。

如您所见,它只是\x,然后是十六进制代码E8。它适用于PHP中的双引号字符串。

答案 1 :(得分:0)

我最终将表格列编码更改为utf8_general_ci,将表格排序更改为utf8_general_ci。我还在我的php文件中添加了以下代码行:

ini_set('default_charset', 'utf-8');

//set encodig to utf-8
mysql_query("SET NAMES 'utf8'"); 
mysql_query("SET CHARACTER SET 'utf8'");

它现在正在运作,但我可能会做一些不推荐的事情?