提问人:Shin Shinue 提问时间:8/10/2023 更新时间:8/11/2023 访问量:30
字符编码问题 - 我想(UTF-8 - JS 和 Windows1250 - PHP)
Character encoding problem - I suppose (UTF-8 - JS and Windows1250 - PHP)
问:
到目前为止,我所有的问题都是通过这个论坛解决的,但现在我又回到了墙上。.:)也许问题是我不知道该问什么问题。
所以我的问题是: 我在女巫用户放置跟踪列表编号中提交了表格 - 在某些情况下,此数字以“%000xxxx”字符开头。 使用 JS 和 AJAX 我发布到 PHP 端点。所以票价,一切都很好,在控制台.log(数据)中我得到url:
endppoint/trackingNumber=%000xxxx&foo=bar
问题始于 php(这是我的猜测) 在 POST 详细信息中,在请求中,我有这样的东西:
trackingNumber: \u000xxx
foo: bar
当我在PHP控制器中打印时 - 我得到:
" 0xxx"
PHP - 是旧的,5.3.3
做:
iconv('UTF-8', 'ISO-8859-1',$data);
我希望能够通过PHP发布完整的跟踪号(使用%000而不是“0”)并理解这一点。
答:
0赞
Sammitch
8/11/2023
#1
您的根本问题是在 URL 编码中很重要,解码为 null/零字节。因此,在将数据包含在 URL 中之前,您应该这样做。%
%00
urlencode()
$trackingNumber = "%000xxx";
$foo = "bar";
$url = 'endppoint/?trackingNumber=' . urlencode($trackingNumber) . '&foo=' . urlencode($foo);
parse_str(parse_url($url)['query'], $parsed); // how it will be read
var_dump(
$url,
$parsed
);
输出:
string(43) "endppoint/?trackingNumber=%25000xxx&foo=bar"
array(2) {
["trackingNumber"]=>
string(7) "%000xxx"
["foo"]=>
string(3) "bar"
}
此外,尽管在这种特定情况下编码似乎并不重要,但您需要谨慎选择编码。Windows cpXXXX 编码和 ISO-8859-X 编码不等效,不应互换。如有必要,PHP可以转换任何一种编码类型,例如:
iconv('UTF-8', 'cp1250', $data);
iconv('UTF-8', 'ISO-8859-2', $data); // cp1250's rough equivalent in 8859, illustrative only
此外,1250 本身很少使用,所以除非你在东欧开发遗留系统,否则它可能不是这样。也许是cp1252?
最后,一般的建议是,文本编码是应该始终已知的元数据,永远不要猜测,任何声称“检测”编码的东西也是猜测。
看:
- https://en.wikipedia.org/wiki/Windows_code_page#Windows-125x_series
- https://en.wikipedia.org/wiki/ISO/IEC_8859#The_parts_of_ISO/IEC_8859
评论
0赞
Shin Shinue
8/11/2023
urlencode($trackingNumber)
解决了我所有的问题。像魅力:)一样工作Cp1250 - 东欧,以及当前遗留;)的遗留系统谢谢。
评论