【问题标题】:Can't remove \ufeff from a string无法从字符串中删除 \ufeff
【发布时间】:2019-06-06 06:54:46
【问题描述】:

该应用程序基本上是这样工作的:

1) 用户上传 CSV 文件。

2) PHP 通过 POST 捕获文件。

3) 我用fopen() 打开文件并用fgetcsv() 读取文件。

第一列总是有\ufeff 字符。我知道这叫做 UTF-8 BOM,它是由 Microsoft Excel 生成的。但是,当我想删除它时,我不能。

我试过了:str_replace('\ufeff', '', $columns[0]);

【问题讨论】:

  • '\ufeff' 不是有效的 C 转义符,无论如何也不能在单引号中工作。
  • 0xFEFF 是 UTF-16 大端字节序标记 (reference)。仅仅剥离它没有多大意义...... :-?
  • @ÁlvaroGonzález 我完全不明白为什么我不能剥离它。
  • 好吧...如果您的应用程序使用 UTF-8(正如您的问题所暗示的那样)并且您读取 UTF-16 文件并假设它是 UTF-8,那么您最终会得到损坏的数据(如果您将 UTF-8 字符与 UTF-16 字符合并),否则您将拥有一个正确的 UTF-16 流,因为它错过了字节顺序信息。
  • 这已作为重复文件关闭,但链接的问题在此处不适用,因为我们正在讨论(强制性)UTF-16 BOM(UTF-8 BOM 是 0xEFBBBF,它是可选的。

标签: php character-encoding


【解决方案1】:

$columns[0] = preg_replace('/\xEF\xBB\xBF/', '', $columns[0]);

$columns[0] = trim($columns[0], "\xEF\xBB\xBF");

【讨论】:

  • 欢迎来到 Stack Overflow!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。
  • 这样做请特别详细说明与现有答案stackoverflow.com/a/68841510/7733418stackoverflow.com/a/54145162/7733418 的功能差异,因为这篇文章似乎没有添加任何内容。
【解决方案2】:
$result = trim($result, "\xEF\xBB\xBF");

这是最简单的解决方法。

【讨论】:

  • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
【解决方案3】:
$headings=array();    
$handle = fopen($_FILES["contacts_file"]["tmp_name"], "r");  
$heading_data=fgetcsv($handle);
             foreach($heading_data as $heading){

              // Remove any invalid or hidden characters
              $heading = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $heading);

              array_push($headings, $heading);
         }

【讨论】:

  • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。
  • 由于上下文原因,这对我很有帮助 - 我正在 Codeigniter 中处理 CSV 文件上传,我需要一种方法从文件的第一行去除 BOM。
【解决方案4】:
$columns[0] = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $columns[0]);

上述代码可帮助您删除文档中存在的隐藏字符,就像您提到的那样。

【讨论】:

  • 它有效,谢谢。我能知道我用那个正则表达式删除了什么吗?
  • 您正在删除特殊字符。
  • @pr1nc3 在每个页面中,我看到不同的正则表达式执行相同的任务。
  • 我们在谈论 BOM,为什么不只测试前 2 个字节并丢弃那些字节。没有替换或搜索。 BOM 只能作为第一个代码点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 2015-09-22
  • 2017-04-30
  • 2021-11-20
相关资源
最近更新 更多