Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php utf-8是否适合文本/纯mime类型?_Php_Character Encoding_Encode - Fatal编程技术网

Php utf-8是否适合文本/纯mime类型?

Php utf-8是否适合文本/纯mime类型?,php,character-encoding,encode,Php,Character Encoding,Encode,我正在通过文件导出数据。输出是base64编码的数据 $data = base64_encode(serialize($data)); 结果是: bGFzcyI6MTp7czo1OiJzZXR1cCI7YTo3Mzp7czoyNToicGFnZXNfY29udGFjdF91c19oZWFkbGlu 所以我想知道哪个字符集更适合这个数据(纯文本)。美国ascii似乎足够了,但utf-8似乎总是一个防错默认值 header('content-type: text/plain; charset=u

我正在通过文件导出数据。输出是base64编码的数据

$data = base64_encode(serialize($data));
结果是:

bGFzcyI6MTp7czo1OiJzZXR1cCI7YTo3Mzp7czoyNToicGFnZXNfY29udGFjdF91c19oZWFkbGlu
所以我想知道哪个字符集更适合这个数据(纯文本)。美国ascii似乎足够了,但utf-8似乎总是一个防错默认值

header('content-type: text/plain; charset=utf-8');

这真的没关系;您的内容是有效的
US-ASCII
,有效的
UTF-8
,有效的
ISO-8859-1
(或者,我相信,任何
ISO-8859-x
),有效的
Windows-1252
,等等。只是不要把
UTF-16
EBCDIC
或其他东西放进去


(值得一提的是,我选择了
US-ASCII
,因为即使是前Unicode计算机也完全支持它,而不是像
ISO-8859-1
或诸如此类的前Unicode字符集;但这确实是一种主观偏好。)

你甚至不需要字符集“text/plain”可能不正确,因为它也不是真正的文本

即使它与ascii、utf-8、latin1(如ruakh所述)兼容,也应该将其视为二进制文件

更新

我想澄清一下这一点(在所有的反对票之后,普通人给了我一个机会!)

@dan04:UTF-8是文本,我没说不是。Base64不是,Base64也是一种编码,但它可以对任何二进制序列进行编码。Base64的编码方式可以使用US-ASCII(因此也可以使用UTF-8和latin1/ISO-8859)对其进行包装

Base64仍然只是一个二进制序列,而不是按定义的文本。同一范围的八位字节值用作US-ASCII(并且可由任何读取US-ASCII的对象“打印”)并不能使其成为文本

这也是Base64没有自己的mimetype的原因。它被认为是一种内容传输编码。(查一查!)

因此,实际正确的方法是使用字符串包含的mimetype以及内容传输编码头为Base64提供服务。例如,如果您正在编码jpeg,则这是正确的格式

Content-Type: image/jpeg
Content-Transfer-Encoding: base64 
这也是为什么我觉得如果你不想对字符串的内容说任何话(或者没有这些信息),最好将其视为“通用二进制”,例如:

Content-Type: application/octet-stream
Content-Transfer-Encoding: base64 

文本/纯文本或utf8部分不应加引号。@quentin谢谢。我真的不知道……我仍然觉得被接受的答案是错误的(尽管我的答案被否决了)。我澄清了我的答案,想重新考虑吗?
utf8
由于字符集无效,它是
utf-8
。请看某个地方,有一个规范规定必须将字符集声明为正确描述它的最小字符集。因此,如果它是严格意义上的ASCII,则必须将其称为ISO-8859-1或UTF-8,或者如果它是Windows-1252的ISO-8859-1子集,则也必须这样说。我认为这是针对电子邮件的,所以可能不适用于这种情况。@tchrist:您的回答是90%正确。目前相关的RFC(2046和2616)确实提出了这一建议,但它们使用“应该”而不是“必须”,这在RFC中是一个有意义的区别。此外,有趣的是,RFC 2616表示“不标记实体比使用标签US-ASCII或ISO-8859-1标记实体更可取”,但说到ISO-8859-1,这已经过时了,因为许多用户代理现在不顾该标准,假定默认字符集为UTF-8。(我注意到IETF本身提供的一些页面带有
charset=ISO-8859-1
),但它可能仍然适用于US-ASCII。但即使它与US-ASCII兼容,也不能成为US-ASCII:)我澄清了我自己的答案,你仍然不同意吗?@埃弗特:我从未真正不同意你的答案,我不知道为什么有人否决它;从理论上讲,这个内容并不是真正的“文本”。但实际上,假装它是文本可能会有好处;例如,如果服务器将其作为文本提供,则浏览器将其呈现为文本,这对于复制和粘贴非常有用。我猜OP是在利用这些优势,否则他可能不会觉得有必要从一开始就对数据进行Base64编码。+1你提到的非常有趣。我以后会把它记下来的。在我的例子中,我使用了
US-ASCII
,因为它确实是一个序列化对象变量。感谢您的贡献。