字符编码问题 - 我想(UTF-8 - JS 和 Windows1250 - PHP)

Character encoding problem - I suppose (UTF-8 - JS and Windows1250 - PHP)

提问人:Shin Shinue 提问时间:8/10/2023 更新时间:8/11/2023 访问量:30

问:

到目前为止,我所有的问题都是通过这个论坛解决的,但现在我又回到了墙上。.:)也许问题是我不知道该问什么问题。

所以我的问题是: 我在女巫用户放置跟踪列表编号中提交了表格 - 在某些情况下,此数字以“%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”)并理解这一点。

JavaScript PHP UTF-8 CP1250

评论

0赞 JosefZ 8/10/2023
欢迎来到 Stack Overflow。请参加2分钟的游览。此外,打开帮助中心并至少阅读如何询问。然后,编辑您的问题以提供一个最小的可重复示例

答:

0赞 Sammitch 8/11/2023 #1

您的根本问题是在 URL 编码中很重要,解码为 null/零字节。因此,在将数据包含在 URL 中之前,您应该这样做。%%00urlencode()

$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?

最后,一般的建议是,文本编码是应该始终已知元数据,永远不要猜测,任何声称“检测”编码的东西也是猜测。

看:

评论

0赞 Shin Shinue 8/11/2023
urlencode($trackingNumber)解决了我所有的问题。像魅力:)一样工作Cp1250 - 东欧,以及当前遗留;)的遗留系统谢谢。