【问题标题】:how to replace apostrophe (’) with single quote(')如何用单引号(')替换撇号(')
【发布时间】:2019-02-01 00:25:34
【问题描述】:

好像撇号有两种。我想知道这个字符(')和this(')的区别

第一个是从 Microsoft Word 复制的,我试图将其粘贴到文本区域,然后插入数据库,但它不起作用。它破坏了我的查询,所以我想用这个(')替换它,请问我该如何实现。

我试过了,但是好像不行

function replace_microsolft_apostrophe($string){
        $string = str_replace('’', "'", $string);
        return $string;
    }

我的查询如下所示:

function create_note($page_id,$title,$note,$category,$author_id){
    global $conn,$notes_table,$pages_table,$notification_table;
    $sql = "INSERT INTO $notes_table(page_id,title,content,note_category) VALUES(?,?,?,?)";
    $query = $conn->prepare($sql);
    $query->bind_param("issi",$page_id,$title,htmlspecialchars($note),$category);
    $query->execute();
}

上面的查询没有这个字符(')也能正常工作

我也想知道为什么会这样?因为它是我按下的同一个键,但是当它进入 Microsoft Word 时,字符似乎发生了变化。我试图让它工作的原因是因为用户可能会从 Microsolf word 中复制已经输入的作品,并过去在我希望他们编写、注释和发布的应用程序上。

任何帮助都会很好。

【问题讨论】:

  • 如果它破坏了你的查询,听起来你很容易受到 SQL 注入的攻击。您应该使用带占位符的参数化查询,这很可能会解决您的问题。您使用的是什么 API?
  • 两者的区别:是右单引号,'是撇号。
  • 我正在使用参数化查询... VALUES(?,?,?,?) ...嗯,它不会破坏我的代码,但由于这种类型的撇号,插入了一个带有空字符串的列
  • replace_microsolft_apostrophe - 只是想知道这是否是一个错字?如果它对此有影响,应该是microsoft?恕我直言,这个问题还不清楚。 var_dump 你的代码/查询,看看结果如何。
  • @jamesOduro 我突然想到了什么;摆脱htmlspecialchars()。 - 这仅用于显示目的,在执行 sql 操作时不使用,并且很可能会转换不应该有的东西。

标签: php


【解决方案1】:

哇!在网上冲浪后,我发现 Pascal Martin's 的答案非常有用......它还参考了一个包含完整答案的网站。 How to replace Microsoft-encoded quotes in PHP

我能够将右引号替换为普通引号

  //convert single-byte apostrophes -encoded
function convert_smart_quotes($string) 

{ 
    $search = array(chr(145), 
                    chr(146), 
                    chr(147), 
                    chr(148), 
                    chr(151)); 

    $replace = array("'", 
                     "'", 
                     '"', 
                     '"', 
                     '-'); 

    return str_replace($search, $replace, $string); 
} 

这个答案也更有用: Converting Microsoft Word special characters with PHP

【讨论】:

  • 您还应该考虑 alternate answer 与上面链接的第一个问题,由 Justin Dominic 提供。它提供了一个更简洁的解决方案(并且它比那里接受的答案有更多的选票),尽管在采用它之前也要阅读iconv 文档。
【解决方案2】:

这似乎是一个字符集问题。您是否检查过您的编辑器的字符集是否设置为ISO-8859-1

无论如何,一种解决方法是将您的字符串转换为十六进制,然后让 MySQL 再次将其转换为字符串。我还没有测试过这段代码,但它应该可以工作。

function create_note($page_id,$title,$note,$category,$author_id){
    global $conn,$notes_table,$pages_table,$notification_table;
    $sql = "INSERT INTO $notes_table(page_id,title,content,note_category) VALUES(?,?,UNHEX(?),?)";
    $query = $conn->prepare($sql);
    $query->bind_param("issi",$page_id,$title,bin2hex(htmlspecialchars($note)),$category);
    $query->execute();
}

【讨论】:

  • 对我不起作用。这个字符(')给我压力
  • @jamesOduro 如果你 echo htmlspecialchars($note) 你看到字符串有问题吗?
  • 是的,字符串中的问号之类的......这意味着找到该字符的位置
  • @jamesOduro 你检查过你的编辑器的字符集是否设置为 ISO-8859-1 吗?
  • 类似这样的:�
猜你喜欢
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多