PHP   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了包含非ASCII字符的字符串被PHP / MySQL截断大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我的页面具有翻译功能here.这里的问题是,当我将语言翻译成法语时,会切掉单词,因为页面无法正确解释单词.我检查了与我的问题有关的帖子,但都没有用.

在我的页面中,我放入了以下@L_618_5@:

>标头(‘Content-Type:text / html; charset = WINDOWS-1252’); ->这仅仅是为了坚持启动编码.我认为这是可选的,但我仍然使用它.
>< Meta http-equiv =“ Content-Type” content =“ text / html; charset = windows-1252”>
>从数据库表名:标签获取等效翻译. Labels的表类型为InnoDB,其认字符集为utf8-UTF-8 Unicode.

é之后的字符被剪切.我需要做些什么才能正确显示字符?谢谢!

解决方法:

我看不到在多语言应用程序的后端使用Unicode和在前端使用代码页的任何意义.您可以在整个项目中使用相同的编码,或者在UTF-8和Windows-1252之间手动来回转换.

我认为您在阅读方面没有问题.标签数据库中被截断,否则浏览器将显示垃圾字符.因此,这不是PHP / HTML的问题,而是MysqL的问题.在èéàòì之类的情况下,MysqL当然能够从UTF-8转换为CP1252(latin1).但是,如果不是这种情况(就像我们尝试将相同的字符串从UTF-8转换为CP1251),MysqL显示一个问号?.

在您的情况下,我认为这是一个输入问题,即标签数据库中被截断了.这怎么可能?您可能拥有UTF8 PHPMysqL,但是当浏览器从加载了这种字符集的页面提交表单时,浏览器会发送Windows-1252字符串.在您的PHP脚本中,您应该在将此字符串插入db中之前将该字符串转码为UTF-8,或者使用SET NAMES’CP1252’连接到MysqL.由于不这样做,您最终尝试插入一堆无效的UTF-8字节,因此MysqL截断字符串,并且标签为空.随附一个测试用例.这是测试表

create table `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

这是PHP部分.请注意,此脚本是UTF-8编码的,因此其中出现的每个文字字符串都具有相同的编码.

// This is a UTF-8 file, so my editor uses UTF-8 and thus each literal
// String is a UTF-8 String, since PHP only has binary Strings.
$label = "Référence";

// Now let's translate this String as if it came from a browser submitTing
// a form loaded from a cp1252 encoded page
$src = mb_convert_encoding($label, "CP1252", "UTF-8");

// But connect as if I were UTF-8
$db = new PDO('MysqL:host=localhost;dbname=test;charset=utf8',
    'test', 'test');

// Insert the String
$stmt = $db->prepare('INSERT INTO test (Name) VALUES ( ? )');
$stmt->bindValue(1, $src);
$stmt->execute();

// Read it
header("content-type: text/plain; charset=windows-1252");
foreach($db->query('SELECT * FROM test') as $row)
    echo $row['name'] . "\n";

您如何恢复?您可以使用cp1252字符集连接到MysqL,然后让MysqL为您翻译,或者您可以对脚本中的字符串进行转码.

正确获取数据后,您必须提取它们并将其放在HTML页面上.这次您将遇到同样的问题,但反过来了:在CP1252文档中显示UTF-8字符串. DB中的字节不合适,因为UTF-8是可变长度编码,而在CP1252中,char恰好是1个字节长.如果将这些字节直接放入页面,浏览器将为多余的字节显示一些乱码.因此,再次,您可以连接到指定CP1252字符集的数据库,以便MysqL负责转换并为您提供正确的字节,或者您可以在PHP端自己对字节进行转码.

或者,您最好帮自己一个忙:在各处使用相同的编码.我建议使用UTF-8,因为今天是正确的选择,但是您可以成功选择CP1252,因为它可以表示英语和法语字符(并节省了一些存储空间,但我认为这不是问题)

大佬总结

以上是大佬教程为你收集整理的包含非ASCII字符的字符串被PHP / MySQL截断全部内容,希望文章能够帮你解决包含非ASCII字符的字符串被PHP / MySQL截断所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: