【问题标题】:Replacing smart quote with regular quote causes entire string to be erased用常规引号替换智能引号会导致整个字符串被删除
【发布时间】:2018-01-23 21:43:15
【问题描述】:

我有一些最初是 RTF 文件的文件。它们使用 Microsoft Word 2016 打开并保存为 .txt 文件。没有对文件进行其他更改。它们被转移到 Linux 系统。

使用命令时:

file myfile.txt 在 Linux 上显示为 Non-ISO extended-ASCII text, with CRLF line terminators

我正在将文件读入 PHP 并逐行处理它们。我正在尝试用常规单引号替换任何正确的智能引号,但我的整个字符串都被删除了。

我的代码如下所示:

$text = "I can’t go for supper";
$text = preg_replace('/\x{2019}/u', "'", $text);
echo $text;

这里的撇号是正确的智能引用,在 Vim 中显示为 <92>。在网上研究后,我发现这实际上是 unicode 字符2019

但是,当我尝试显示 $text 的新值时,没有显示任何内容。

我的代码有什么问题,为什么它会清除整个文本字符串?

【问题讨论】:

  • 无法复制。 3v4l.org/8aBbH
  • 不知道3v4l.org/f5Gu7
  • 问题是 3v4l.org 上的那些引用没有显示为代码 所以不是真实的表示。
  • 代码<92>是什么意思?
  • @AbraCadaver 在回复您时,我发现字符代码 是 Windows-1252 编码集的特定部分。我相信解决方案是在我读到的每一行上使用 iconv()。

标签: php regex unicode


【解决方案1】:

经过进一步研究,我确定字符代码 <92> 特定于 Windows-1252 字符编码。在能够操作字符串之前,我首先需要将其转换为 UTF-8。

以下代码可以正常工作:

$text = "I can’t go for supper";
$text = iconv("Windows-1251", "UTF-8", $text);
$text = preg_replace('/\x{2019}/u', "'", $text);
echo $text;

【讨论】:

  • 好好研究这个。
猜你喜欢
  • 1970-01-01
  • 2010-10-14
  • 2018-08-22
  • 2013-11-17
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
相关资源
最近更新 更多