ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Php无法找到分割utf-8字符串的方法

2019-06-13 20:17:46  阅读:358  来源: 互联网

标签:php utf-8 multibyte mbstring


我刚刚开始涉足php,我担心我需要一些帮助来弄清楚如何操作utf-8字符串.

我在ubuntu 11.10 x86,php版本5.3.6-13ubuntu3.2工作.我有一个utf-8编码文件(vim:set encoding确认这个)然后我继续阅读它

$file = fopen("file.txt", "r");
while(!feof($file)){
    $line = fgets($file);
    //...
}
fclose($file);

>使用mb_detect_encoding($line)报告UTF-8
>如果我回显$line,我可以在浏览器中正确看到该行(没有错位的字符)

>所以我猜浏览器和apache的一切都很好.虽然我确实搜索了我的apache配置AddDefaultCharset并尝试添加http元标记用于字符编码(以防万一)

当我尝试使用$arr = mb_split(‘;’,$line)拆分字符串时,结果数组的字段包含错误的utf-8字符(mb_detect_encoding($arr [0])也报告utf-8).

因此echo $arr [0]将导致如下内容:ΒÎ〜Î-ÎÎ.

我试过设置mb_detect_order(‘utf-8’),mb_internal_encoding(‘utf-8’),但没有改变.我还尝试使用this w3 perl regex手动检测utf-8,因为我在某处读到mb_detect_encoding有时会失败(神话?),但结果也一样.

所以我的问题是如何正确分割字符串?以错误的方式走下mb_路径?我错过了什么?

谢谢您的帮助!

更新:我正在添加示例字符串和base64等价物(感谢@chris’的建议)

1. original string: "ΑΘΗΝΑ;ΑΙΓΑΛΕΩ;12242;37.99452;23.6889"
2. base64 encoded: "zpHOmM6Xzp3OkTvOkc6ZzpPOkc6bzpXOqTsxMjI0MjszNy45OTQ1MjsyMy42ODg5"
3. first part (the equivalent of "ΑΘΗΝΑ") base64 encoded before splitting: "zpHOmM6Xzp3OkQ=="
4. first part ($arr[0] after splitting): "ΑΘΗÎΑ"
5. first part after splitting base64 encoded: "77u/zpHOmM6Xzp3OkQ=="

好的,所以在这之后似乎有一个77u / 3和5之间的差异.其中according to this是一个utf-8 BOM标记.那我怎么能避免呢?

更新2:我今天醒来时精神焕发,记住你的提示,我又试了一次.似乎$line = fgets($file)正确读取第一行(没有损坏的字符),并且每个后续行都失败.那么我base64_encoded第一行和第二行,77u / bom只出现在第一行的base64’d字符串上.然后我在vim中打开了违规文件,然后输入:set nobomb:w保存没有bom的文件.再次启动php显示第一行现在也被破坏了.基于@hakre的remove_utf8_bom,我添加了它的补充功能

function add_utf8_bom($str){
    $bom= "\xEF\xBB\xBF";
    return substr($str,0,3)===$bom?$str:$bom.$str;
}

并且现在每条线都正确读取了.

我不太喜欢这个解决方案,因为它似乎非常非常hackish(我无法相信整个框架/语言没有提供处理nobombed字符串的方法).所以你知道另一种方法吗?否则我将继续上述.

感谢@ chris,@ hakre和@jacob的时间!

更新3(解决方案):事实证明它是一个浏览器的东西:它不足以添加标题(‘Content-type:text / html; charset = UTF-8’)和元标记像< meta http-equiv =“Content-type”value =“text / html; charset = UTF-8”/>.它也必须正确地包含在< html>< body>内.部分或浏览器无法正确理解编码.感谢@jake的建议.

故事的故事:我首先应该在尝试编写浏览器之前了解更多有关html的知识.感谢您的帮助和耐心.

解决方法:

当您在php中编写调试/测试脚本时,请确保输出或多或少有效的HTML页面.

我喜欢使用类似于以下的PHP文件:

<!DOCTYPE html>
<html>
  <head>
    <meta charset=utf-8>
    <title>Test page for project XY</title>
  </head>
  <body>
     <h1>Test Page</h1>
     <pre><?php
        echo print_r($_GET,1);
     ?></pre>
  </body>
</html>

如果您不包含任何HTML标记,浏览器可能会将该文件解释为文本文件,并且可能会发生各种奇怪的事情.在您的情况下,我假设浏览器将该文件解释为Latin1编码的文本文件.我认为它适用于BOM,因为每当BOM存在时,浏览器都会将该文件识别为UTF-8文件.

标签:php,utf-8,multibyte,mbstring
来源: https://codeday.me/bug/20190613/1235046.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有