这些已经过时了吗?它们似乎是有史以来最糟糕的想法 - 在文件的内容中嵌入了一些无人能看到的内容,但会影响文件的功能.我不明白为什么我会想要一个.
看起来用于UTF16-LE和UTF-32LE的字节顺序标记之间存在歧义.特别是,考虑一个包含以下8个字节的文件:
FF FE 00 00 00 00 00 00
Run Code Online (Sandbox Code Playgroud)
如何判断此文件是否包含:
Unicode BOMs在这里描述:http://unicode.org/faq/utf_bom.html#bom4但是没有讨论这种歧义.我错过了什么吗?
我有一个博客(基于wordpress).并尝试通过w3c验证器验证我的一个页面.第一个错误是:
Line 1, Column 1: Non-space characters found without seeing a doctype first. Expected <!DOCTYPE html>.
<!DOCTYPE html><!-- HTML 5 -->
Run Code Online (Sandbox Code Playgroud)
此外,DebugBar(http://www.my-debugbar.com/wiki/IETester/HomePage)同意并<!在我从此工具中的"HTML Check"选项卡打开同一页面之前显示两个不可见的字符.但!!
<!DOCTYPE html><!-- HTML 5 --><!.所以,考虑到所有事情,为什么以及从哪里获得这些"奇怪的符号"?
我将Excel表保存为文本(*.txt).不幸的是,Excel不允许我选择编码.所以我需要在记事本(打开为ANSI)中打开它并将其保存为UTF-8.然后,当我在R中读到它时:
data <- read.csv("my_file.txt",header=TRUE,sep="\t",encoding="UTF-8")
Run Code Online (Sandbox Code Playgroud)
它显示以"XUFEFF."开头的第一列的名称.我知道这些是保留的字节,告诉任何程序该文件是UTF-8格式.所以它不应该显示为文本!这是一个错误吗?或者我错过了一些选择?提前致谢!
我需要读取可能包含或不包含字节顺序标记的Unicode文件.我当然可以自己检查文件的前几个字节,如果找到则丢弃BOM.但在此之前,有没有任何标准的方法可以做到这一点,无论是在核心库还是第三方?
我有文件中的字符串,其中包含BOM(来自UTF-8).我想将此字符串转换为win-1251并将其放入文件中.
我试图以这种方式从字符串中删除BOM:
out.write(l.replace('\uFEFF','\0') + "\n");
Run Code Online (Sandbox Code Playgroud)
但它不起作用.为什么?
在win-1251文件中输出此字符串:
?1,...SOME_TEXT_HERE
Run Code Online (Sandbox Code Playgroud)
第一个"?" 标志是非法的.
我有一个 JAX-RS REST-Service,它生成一个 CSV 文件并将其流回浏览器。一切都设置为 UTF-8,所以我通过浏览器下载的文件也是一个有效的 UTF-8 文件(没有 BOM),它在 Notepad++、Sublime 等中向我显示有效、可读的 UTF-8 变音等。
虽然在 Excel 中打开这样的文件会导致不可读的变音等,因为 Excel 显然试图用另一个字符集打开它(CP-1252,我猜,但这并不重要)。
通过 Notepad++ 使用 BOM 保存文件并在 Excel 中重新打开它效果很好。似乎 BOM 的检测是 Excel 用来检测 UTF-8 的唯一方法。无论如何 - 我认为添加 BOM 可以帮助......
做过某事。结果一样。过了一会儿,我发现在某些情况下 BOM 会被删除:如果我在 BOM 之前添加任何字符,我可以在我的十六进制编辑器中看到 BOM。删除该字符后,BOM 将不再存在。
当我继续通过 cURL 下载文件时,我真的很惊讶。BOM 就在那里!在那之前,我认为这可能与我的应用程序、内容类型、编码、HTTP 标头等有关 - 但它们似乎都很好。
现在,经过数小时的尝试不同的东西,关于如何告诉浏览器保留 BOM 的任何想法?我可以设置任何 HTTP 标头吗?由于 Chrome、Internet Explorer、Edge、Firefox 都删除了 BOM,这对我来说听起来有点像浏览器约定......
非常感谢您的大力帮助!
编辑:感谢 sideshowbarker 的回答,我找到了一种解决方法,即在内容之前添加两个 BOM,因此在浏览器删除第一个 BOM 后,将剩余一个 BOM。
我正在尝试运行已从大量源自动生成的脚本集合.不幸的是,其中一些已生成为带有BOM的UTF-8.我已经建立了一个自动删除BOM的系统,但它有点混乱.
未能删除BOM会生成错误:
SP2-0042: unknown command "" - rest of line ignored.
Run Code Online (Sandbox Code Playgroud)
是否可以在具有BOM的脚本文件上运行SQLPLUS?
字面上混淆了htonl().在这么多链接中,我发现执行htonl的代码是:
#define HTONL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
((((unsigned long)(n) & 0xFF00)) << 8) | \
((((unsigned long)(n) & 0xFF0000)) >> 8) | \
((((unsigned long)(n) & 0xFF000000)) >> 24))
Run Code Online (Sandbox Code Playgroud)
如果在两台机器上运行相同的代码,它将交换字节顺序.示例:uint32_t a = 0x1;
在Little Endian:
100 1
101 0
102 0
103 0
Run Code Online (Sandbox Code Playgroud)
在htonl之后(a)
100 0
101 0
102 0
103 1
Run Code Online (Sandbox Code Playgroud)
============================================ 在Big Endian机器上:
100 0
101 0
102 0
103 1
Run Code Online (Sandbox Code Playgroud)
在htonl之后(a)
100 1
101 0
102 0
103 0 …Run Code Online (Sandbox Code Playgroud) 我使用iTextSharp 5.5.1以数字方式使用分离签名(从第三方机构获得)签署PDF文件.一切似乎都运行正常,文件有效,例如Adobe Reader报告没有问题,将签名显示为有效等.
问题是Java客户端显然存在这些文件的一些问题 - 文件既不能打开也不能解析.
这些文件在标题中有一个字节顺序标记,这似乎会导致该行为(\ x00EF\x00BB\x00BF).
我可以像这样识别BOM:
PdfReader reader = new PdfReader(path);
byte[] metadata = reader.Metadata;
// metadata[0], metadata[1], metadata[2] contain the BOM
Run Code Online (Sandbox Code Playgroud)
我如何可以删除的BOM(不失签名的有效性),或强制iTextSharp的图书馆不将这些字节附加到文件?