当前位置: 首页>编程语言>正文

PHP取得json前面有乱码(去除文件头部BOM ,php json输出有??,css样式也不正常,去除php bom头 ,chrome调试窗口开头多一个空格,有小红点 PHP去掉json字符串中的

问题

PHP取得json前面有乱码(去除文件头部BOM ,

php json输出有??,css样式也不正常

,去除php bom头 ,

chrome调试窗口开头多一个空格,有小红点 PHP去掉json字符串中的

简体中文,改成繁体中文,或者其他国家的文字,json错误

在PHP中,如果你想要直接输出JSON而不包含BOM(Byte Order Mark),你可以使用json_encode函数来生成JSON字符串,然后使用header函数来设置响应类型为JSON,并确保不输出BOM。

以下是一个简单的例子:

<?php
 // 数据数组
 $data = array('name' => 'John', 'age' => 30, 'email' => 'john@example.com');
  
 // 设置响应类型为JSON
 header('Content-Type: application/json; charset=UTF-8');
  
 // 防止输出BOM
 if (substr(PHP_SAPI, 0, 3) === 'cgi') {
     // CGI模式时需要额外处理
     if (function_exists('apache_setenv')) {
         @apache_setenv('no-gzip', '1');
         @ini_set('zlib.output_compression', 'Off');
         @apache_setenv('no-chunked', '1');
     }
 } else {
     @ini_set('zlib.output_compression', 'Off');
     @ini_set('output_handler', '');
 }
  
 // 输出JSON字符串
 echo json_encode($data);
 ?>

在这个例子中,我们首先设置了响应类型为application/json,并且关闭了PHP的压缩输出设置,以确保不会输出BOM。然后,我们使用json_encode将数组转换成JSON格式,并直接输出。

请注意,关闭输出压缩对性能有轻微影响,因此在生产环境中应该根据需要进行相应的优化。

如果php程序文件本事是bom格式的。去除bom格式

//只要把此文件另存为removebom.php,放在服务器根目录,然后执行,就可以去除服务器端bom,//在chrome有小红点的开始 1 <?php
 2 //remove the utf-8 boms
 3 //by magicbug at gmail dot com
 4 if (isset($_GET['dir'])){ //config the basedir
 5  $basedir=$_GET['dir'];
 6 }else{
 7  $basedir = '.';
 8 } 
 9 $auto = 1; 
10 checkdir($basedir);
11 function checkdir($basedir){
12  if ($dh = opendir($basedir)) {
13   while (($file = readdir($dh)) !== false) {
14    if ($file != '.' && $file != '..'){
15     if (!is_dir($basedir."/".$file)) {
16      echo "filename: $basedir/
17 $file ".checkBOM("$basedir/$file")." <br>";
18     }else{
19      $dirname = $basedir."/".
20 $file;
21      checkdir($dirname);
22     }
23    }
24   }
25  closedir($dh);
26  }
27 }
28 
29 function checkBOM ($filename) {
30  global $auto;
31  $contents = file_get_contents($filename);
32  $charset[1] = substr($contents, 0, 1);
33  $charset[2] = substr($contents, 1, 1);
34  $charset[3] = substr($contents, 2, 1);
35  if (ord($charset[1]) == 239 && ord($charset[2]) == 187 &&
36  ord($charset[3]) == 191) {
37   if ($auto == 1) {
38    $rest = substr($contents, 3);
39    rewrite ($filename, $rest);
40    return ("<font color=red>BOM found, 
41 automatically removed.</font>");
42   } else {
43    return ("<font color=red>BOM found.
44 </font>");
45   }
46  }
47  else return ("BOM Not Found.");
48 }
49 
50 function rewrite ($filename, $data) {
51  $filenum = fopen($filename, "w");
52  flock($filenum, LOCK_EX);
53  fwrite($filenum, $data);
54  fclose($filenum);
55 }
56 ?>

 源码引用自 

还有 eBay Marketplace Account Deletion/Closure Notifications Workflow | eBay Developers Program

eBay Marketplace Account Deletion/Closure Notifications Workflow | eBay Developers Programhttps://developer.ebay.com/marketplace-account-deletion

mportant!我们强烈建议实现使用JSON库来创建响应体。当实现通过写出字符串值而不是创建挑战响应时,字节顺序标记(BOM)通常会预置到响应体。由于一个 BOM 被认为是无效的 JSON, 接收服务有问题解析例外, 作为一个结果, 尝试订阅到市场账户删除通知失败.

For more information, reference to:

  • 第8节。字符编码,RFC8259
  • Byte Order Mark (BOM) FAQ on the Unicode 网站

问:什么是BOM?

字节顺序标记 (月初(beginning of month的缩写))由数据流开头的字符代码U+FEFF组成,在这里它可以用作签名定义字节顺序和编码形式,主要是未标记的明文文件。在一些更高级别的协议下,在该协议中定义的Unicode数据流中可能强制(或禁止)使用BOM。[AF]

问:BOM有什么用处?

A 月初(beginning of month的缩写)在键入为文本的文件的开头很有用,但不知道这些文件是大端还是小端格式,它还可以作为一种提示,表明文件是Unicode格式的,而不是传统编码格式的。此外,它还可以作为签名具体来说编码形式二手的。[AF]

问:endian是什么意思?

长于一个字节的数据类型可以用最高有效字节(最高有效位)第一还是最后。前者被称为大端的,后者小端的。交换数据时,在发送系统上以“正确”顺序出现的字节在接收系统上可能会显得无序。在这种情况下月初(beginning of month的缩写)看起来像0xFFFE非字符允许接收系统在处理数据之前应用字节反转。UTF-8是面向字节的,因此没有这个问题。然而,最初的BOM可能有助于确定数据流为UTF-8。[AF]

问:BOM仅用于16位Unicode文本吗?

A 月初(beginning of month的缩写)可以用作签名无论Unicode文本如何转换:UTF-16, UTF-8,或者UTF-32。组成BOM的确切字节将是由该转换成的任何Unicode字符U+FEFF转换格式。在这种形式中,BOM用于指示它是一个Unicode文件,以及它采用哪种格式。示例:

字节

编码形式

00 00 FE FF

UTF-32,大端的

FF FE 00 00

UTF-32,小端的

FE FF

UTF-16,大端

FF FE

UTF-16,小端字节

EF BB BF

UTF-8

问:UTF-8数据流可以包含BOM字符(UTF-8格式)吗?如果是,那么我还可以认为剩余的UTF 8字节是以大端顺序排列的吗?

是的,UTF-8可以包含一个月初(beginning of month的缩写)。然而,它使字节流的字节序差异。UTF 8总是有相同的字节顺序。初始BOM是仅仅用作签名—表示一个未标记的文本文件在UTF 8中。请注意,一些UTF-8编码数据的接收者并不期待BOM。在使用UTF-8的地方透明地在8位环境中,使用BOM会干扰任何期望特定美国信息交换标准代码字符开头,如使用“#!”Unix shell开头的剧本. 【AF】

问:我该如何处理文件中间的U+FEFF?

如果没有协议支持将其用作月初(beginning of month的缩写)并且当不在文本流的开头时,U+FEFF通常不应该出现。向后和睦相处它应该被视为零宽度不间断空格(ZWNBSP),然后是文件或字符串内容的一部分。U+2060字的使用工匠在表达单词连接语义方面,比ZWNBSP更受青睐,因为它不会与BOM混淆。当设计一种标记语言或数据协议时,U+FEFF的使用可能仅限于字节顺序标记。在这种情况下,出现在文件中间的任何U+FEFF都可以被视为不支持的字符. [AF]

问:我使用的协议在文本开头有BOM。我如何表示一个初始的ZWNBSP?

使用U+2060 WORD工匠相反。

问:如何标记不会将U+FEFF解释为BOM的数据?

使用标签UTF-16BE来表示大端的 UTF-16文本,以及UTF-16LE来表示小端的UTF-16文本。如果您确实使用了月初(beginning of month的缩写),将文本标记为简单UTF-16. [医学博士]

问:为什么我不总是使用需要BOM的协议?

如果数据具有关联的类型,如数据库中的字段,则月初(beginning of month的缩写)没有必要。特别是,如果文本数据流被标记为UTF-16BE, UTF-16LE, UTF-32BE或者UTF-32LE,BOM既不必要也不允许。任何U+FEFF都会被解释为ZWNBSP。

不要用BOM标记数据库或字段集中的每个字符串,因为这会浪费空间并使字符串连接变得复杂。此外,这还意味着两个数据字段可能具有完全相同的内容,但不是二进制相等的(其中一个字段前面有BOM)。

问:我应该如何处理材料清单?

以下是一些需要遵循的准则:

  1. 特定协议(例如微软的。txt文件)可能需要使用月初(beginning of month的缩写)在某些Unicode数据流上,如文件。当你需要符合这样的协议时,使用BOM。
  2. 对于未标记的文本,一些协议允许可选的BOM。在这些情况下,
  • 在已知文本数据流纯文本,但编码未知,BOM可用作签名。如果没有BOM,编码可以是任何东西。
  • 如果已知一个文本数据流是普通Unicode文本(但不是哪种字节顺序),则BOM可以用作签名。如果没有物料清单,文本应解释为大端的.
  1. 一些面向字节的协议期望美国信息交换标准代码文件开头的字符。如果UTF-8与这些协议一起使用,使用BOM作为编码形式应避免签名。
  2. 其中数据流的精确类型是已知的(例如Unicode big-endian或Unicode小端的),不应使用BOM。特别是,每当数据流被声明为UTF-16BE, UTF-16LE, UTF-32BE或者UTF-32LE炸弹必须不被使用。(另请参见问:UCS-2和UTF-16有什么区别?.) [AF]

https://www.xamrdz.com/lan/56w1957289.html

相关文章: