我正在尝试使用带有键作为查找表的数组将字符串转换为数字。
这是数组:
$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字符串仍然是“è”?
答案 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'");
它现在正在运作,但我可能会做一些不推荐的事情?