【问题标题】:Interpreting Swedish letters (å, ä, ö) in a GET form submission在 GET 表单提交中解释瑞典字母(å、ä、ö)
【发布时间】:2020-08-03 03:34:21
【问题描述】:

我目前正在创建一个自定义 WordPress 主题。一些存档页面将包含隐藏表格(以图片表示)。这些表格中的每一个都代表一个帖子。当用户点击表单时,会运行 GET 请求,并且浏览器会检索特定帖子的内容。

每个隐藏表单都将帖子的标题作为值(作为查询字符串,如下所示:/lokaler/?lokal=Studion('Studion' 是标题,'lokaler' 是帖子类型))。这工作正常,我得到所需的信息,没问题。

当我想对包含 Ä 的标题执行相同操作时,就会出现问题。查询 /lokaler/?lokal=Sammanträdesrummet (显然)不起作用,但我似乎找不到解决方法...我在此页面上使用了 JavaScript 和 PHP 的组合。

我将如何解决它以使 GET 请求有效,但我不必更改帖子的标题?

//how the form is created:

 <form method="GET" id="lokal_<?php echo get_the_title(); ?>" class="single_lokal_container single_lokal_lokal">
   <input type="hidden" name="lokal" value="<?php echo get_the_title(); ?>">

   etc...


//how post is queried
$current_lokal_from_uri = htmlspecialchars($_GET['lokal']);

            $args3 = array(
                'name'          =>      $current_lokal_from_uri,
                'post_type'     =>      'lokaler'
            );

【问题讨论】:

  • 更新:我已经使用 urlencode 和 urldecode 来摆脱 ä。我可以说它起作用了,因为其中有一个空格的另一个名称,但是带有 ä 的名称仍然不起作用。我认为这是 wp_query 的问题,它不允许 ä (因为当我 var_dump 它打印“Sammanträdesrummet”时,但查询没有找到它).. 这是一个无法解决的问题周围?

标签: javascript php wordpress get-request


【解决方案1】:

您应该能够通过 GET 参数很好地传递这些。只要确保编码和解码一致:

var plain = 'åäö';
var urlencoded = encodeURIComponent(plain);
var unencoded = decodeURIComponent(urlencoded);

console.log('plain', plain);// plain åäö 
console.log('urlencoded', urlencoded);// urlencoded %C3%A5%C3%A4%C3%B6 
console.log('unencoded', unencoded);// unencoded åäö
echo urldecode('%C3%A5%C3%A4%C3%B6'); // åäö

请记住,HTMLSpecialChars 用于将字符编码为 html 安全风格而不是参数编码(例如,&amp;amp; 变为 &amp;amp;&lt; 变为 $lt;

【讨论】:

  • 我应该在创建表单/定义值时进行编码吗?
  • 取决于get_the_title() 返回的内容,这样的东西应该可以工作:value="&lt;?php urlencode(echo get_the_title()); ?&gt;"&gt;
【解决方案2】:

我已经设法解决了这个问题。

我使用 urlencode 和 decode 作为表单的值。尝试从解码值生成 wp_query 时出现下一个问题。最后,这是一个简单的修复:我必须将解码值中的 ä 替换为 a:


            $current_lokal_from_uri_decoded = urldecode($current_lokal_from_uri);      

            if(strpos($current_lokal_from_uri_decoded, 'ä') !== false) {
                $current_lokal_from_uri_decoded = str_replace('ä', 'a', $current_lokal_from_uri_decoded);
            } 

            $args3 = array(
                'name'          =>      $current_lokal_from_uri_decoded,
                'post_type'     =>      'lokaler'
            );

【讨论】:

  • 您可能应该使用位置引用的 PK/ID 而不是名称。更容易保持安全,没有编码问题,位置名称可能会改变。身份证没有。
  • 我明白你的意思。但是,我想让最终用户更容易理解 URI,因此选择 lokal=Sammanträdesrummet 而不是 lokal=213。不过也许这是个坏主意..(它在一个网站上,人们可以看到哪些房间可供出租)
  • @Teson 你认为当我得到 lokal-name 时使用它就足够了吗? $current_lokal_from_uri = filter_var ($_GET['lokal'], FILTER_SANITIZE_STRING);
猜你喜欢
  • 2017-04-04
  • 2011-07-28
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 2013-02-26
  • 2014-11-03
相关资源
最近更新 更多