我正在使用Yii2 Framework和Sphinx Search服务器编写一个用于多语言搜索的Web服务。搜索在网站上完全正常,但在点击此网络服务时会抛出错误;
{
"name": "PHP Warning",
"message": "json_encode(): Invalid UTF-8 sequence in argument",
"code": 2,
"type": "yii\\\\base\\\\ErrorException",
"file": "C:\\\\xampp\\\\htdocs\\\\my-website\\\\vendor\\\\yiisoft\\\\yii2\\\\helpers\\\\BaseJson.php",
"line": 38,
"stack-trace": [
"#0 [internal function]: yii\\\\base\\\\ErrorHandler->handleError(2, 'json_encode(): ...', 'C:\\\\xampp\\\\htdocs...', 38, Array)",
"#1 C:\\\\xampp\\\\htdocs\\\\my-website\\\\vendor\\\\yiisoft\\\\yii2\\\\helpers\\\\BaseJson.php(38): json_encode(Array, 320)",
"#2 C:\\\\xampp\\\\htdocs\\\\my-website\\\\vendor\\\\yiisoft\\\\yii2\\\\web\\\\JsonResponseFormatter.php(53): yii\\\\helpers\\\\BaseJson::encode(Array)"
]
}
我使用fzaninotto / Faker软件包在英语和法语语言中将大量虚拟真实文本播种到数据库中。狮身人面像搜索的工作原理是“按标题搜索”和“按类别ID搜索”。我发现当使用具有法语翻译的某些特定类别ID进行搜索时会出现此错误。因此,当Sphinx对类别进行索引时,它会更改排序规则(UTF-8),当从sphinx检索回来时,会发生错误。并且在没有json_encode()的情况下转储数据会给出一些数据库表中不存在的垃圾类别文本,
这是我的sphinx配置
index tender
{
source = post
path = C:/xampp/htdocs/sphinx/data/posts
min_infix_len = 3
enable_star = true
charset_type = utf-8
charset_table = 0..9, A..Z->a..z, _, a..z, \
U+410..U+42F->U+430..U+44F, U+430..U+44F, \
U+C5->U+E5, U+E5, U+C4->U+E4, U+E4, U+D6->U+F6, U+F6, U+16B, U+0c1->a, U+0c4->a, \
U+0c9->e, U+0cd->i, U+0d3->o, U+0d4->o, U+0da->u, U+0dd->y, U+0e1->a, U+0e4->a, \
U+0e9->e, U+0ed->i, U+0f3->o, U+0f4->o, U+0fa->u, U+0fd->y, U+104->U+105, U+105, \
U+106->U+107, U+10c->c, U+10d->c, U+10e->d, U+10f->d, U+116->U+117, U+117, \
U+118->U+119, U+11a->e, U+11b->e, U+12E->U+12F, U+12F, U+139->l, U+13a->l, \
U+13d->l, U+13e->l, U+141->U+142, U+142, U+143->U+144, U+144, U+147->n, \
U+148->n, U+154->r, U+155->r, U+158->r, U+159->r, U+15A->U+15B, U+15B, U+160->s, \
U+160->U+161, U+161->s, U+164->t, U+165->t, U+16A->U+16B, U+16B, U+16e->u, \
U+16f->u, U+172->U+173, U+173, U+179->U+17A, U+17A, U+17B->U+17C, U+17C, U+17d->z, U+17e->z
}
在源配置中,类别属性就像这样
source post
{
# above is the query, config and other attributes
sql_field_string = cat_name_attr # English category
sql_field_string = cat_name_attr_fr # French category
}
和Yii2中的sphinx配置
'sphinx' => [
'class' => 'yii\sphinx\Connection',
'dsn' => 'mysql:host=127.0.0.1;port=9306;',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
],
我尝试为UTF-8整理配置所有内容,甚至调用
json_encode($record, JSON_UNESCAPED_UNICODE) // $records stores the data
但他们没有用:'(
什么证实,当翻译的类别被索引到sphinx存储中时,它的charset是JSON无法读取的更改。 因此,例如存储在MySQL表中的“电子和电子”类别法语翻译为
“Electricitéetélectroniques”
但是当索引到Sphinx时,它会改为这个,
“Electricit et lectroniques”
并且该文本不是由json_encode编码的。
答案 0 :(得分:0)
黑钻石(�)是浏览器说wtf的方式。它来自拥有latin1字符,但告诉浏览器 显示utf8字符。
你可以告诉浏览器显示<meta ... charset=ISO-8859-1>
。
有时这会与问号一起出现,在这种情况下你必须重新开始。