【问题标题】:Special chars in single and double quoted strings单引号和双引号字符串中的特殊字符
【发布时间】:2011-04-12 16:15:12
【问题描述】:

我从包含 rtf 文档的数据库中获取一个字段。

例如,这可能如下所示:

{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil\fcharset0 Calibri;}} {*\generator Msftedit 5.41.21.2509;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang7\f0\fs22 asdfasdf\par a\par sf\par asd\par fasd\par \b dfas\b0\par dfas\par }

现在 PHP 将其作为双引号从数据库中获取,结果是该字符串不会被以字符方式解释...假设特殊字符如 '\r' 和 '\n' 已被识别。

如何从这个双引号转换为单引号字符串,以便获得所有原始字符?或者当我从数据库中获取值时,如何实现将值指定为单引号?

提前致谢

-拉尔夫

【问题讨论】:

  • 没有像双引号一样获取的东西。原始字符是什么意思?你到底有什么问题?单引号和双引号只对字符串文字很重要。

标签: php string rtf converter


【解决方案1】:

现在 PHP 将其获取为双引号 来自数据库

什么? mysql_fetch_row 或 whatewer 的结果只是一个字符串。没有以任何方式重新解释。 \n 只保留\n。只有您在 PHP 文件中写入双引号的字符串 literals 会被“解释”然后存储为字符串。

没有什么比单引号或双引号字符串更好的了。 PHP 源代码中只有单引号或双引号的字符串文字,实际的 PHP 字符串将从这些文字中生成。

你现在唯一的问题是如何process/parse the RTF data。 (假设数据存储在 blob 列中,因此字符编码没有复杂性。)

【讨论】:

  • RTF 存储在 MSSQL 数据库的 Blob 字段中。我通过 mssql_fetch_assoc 检索行......当它打印时,所有出现的 \r 或 \n 都被解释为这些......而不是普通字符......
  • 您的意思是要打印 \r / \n 而不被解释为特殊字符?
  • 是的。如果您查看原始字符串的开头,它应该看起来像: {\rtf1... in hex => 0x7b 0x5c 0x72 0x74 0x66 但在 php 保存的字符串中,它看起来像这样的十六进制 => 0x7b 0xd7 0x46 0x63 0x15
  • 好的,谢谢你的帮助,看来问题是由我的测试用例引起的......我从我的数据中得到了正确的字符串。但是我的汤序列化程序在特殊字符方面遇到了麻烦……我是过失。
【解决方案2】:

首先,您应该投入一些时间,谁(或什么)正在逃避您的代码。

但为了快速解决,请尝试使用 stripslashes() 函数:

$unsecaped = stripslashes( $database_data );

但我强烈建议您尝试找出导致数据泄露的原因。 这可能发生:

  • 在将数据插入数据库之前。这通常是由 PHP 指令 magic_quotes_gpc 引起的。
  • 从数据库中检索数据时。

更新

我不明白你的问题... 您希望保留所有这些反斜杠,但避免将 \r 和 \n 解释为回车和换行...

尝试执行 str_replace 以找到所有那些 \r 和 \n 并用 \r 和 \n 替换它们。

我不知道 \r 是否属于任何明智的字符,所以也许你应该只替换 " \r "/" \n ",你可能需要 preg_replace() 。

【讨论】:

  • stripsplashes 没有帮助,因为我想将此 RTF 文本转换为纯文本。所以像 \rtf1 或 \ansi 这样的关键字应该为解析器保留。
猜你喜欢
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多