我的应用程序中有以下XML解析代码:
public static XElement Parse(string xml, string xsdFilename)
{
var readerSettings = new XmlReaderSettings
{
ValidationType = ValidationType.Schema,
Schemas = new XmlSchemaSet()
};
readerSettings.Schemas.Add(null, xsdFilename);
readerSettings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
readerSettings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
readerSettings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
readerSettings.ValidationEventHandler +=
(o, e) => { throw new Exception("The provided XML does not validate against the request's schema."); };
var readerContext = new XmlParserContext(null, null, null, XmlSpace.Default, Encoding.UTF8);
return XElement.Load(XmlReader.Create(new StringReader(xml), readerSettings, readerContext));
}
Run Code Online (Sandbox Code Playgroud)
我用它来解析发送到我的WCF服务的字符串到XML文档,用于自定义反序列化.
当我读入文件并通过网络发送它们时(请求),它工作正常; 我已经确认没有发送BOM.在我的请求处理程序中,我正在序列化响应对象并将其作为字符串发送回来.序列化过程将UTF-8 BOM添加到字符串的前面,这会导致在解析响应时中断相同的代码.
System.Xml.XmlException : Data at the root level is …Run Code Online (Sandbox Code Playgroud) 我已经编写了一个ASMX Web服务,该服务已经在生产中运行多年.今天,Java客户端突然在尝试解析响应时抛出错误.我们将其跟踪到XML声明之前出现的BOM(字节顺序标记):
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/xml; charset=utf-8
Content-Encoding: gzip
Expires: -1
Vary: Accept-Encoding
Server: Microsoft-IIS/7.0
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
MicrosoftSharePointTeamServices: 12.0.0.6300
Date: Wed, 22 Jun 2011 19:59:49 GMT
Content-Length: 3629
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap...
Run Code Online (Sandbox Code Playgroud)
该代码在一年多内没有改变.Web服务在IIS中的MOSS 2007站点下运行,您可以从上面的HTTP标头中看到,但它有自己的web.config.
据我们所知,服务器的配置没有任何重大变化,但它必定是一些东西.可能导致这种情况的任何想法?
如果我们无法追踪并恢复更改,那么下一个问题是,我可以在我的代码中修复此问题吗?
这是一个带有.asmx文件的vanilla ASMX Web服务,如下所示:
<%@ WebService Language="c#" Codebehind="MyStuff.asmx.cs" Class="MyStuff.MyService" %>
Run Code Online (Sandbox Code Playgroud)
和.asmx.cs文件看起来像这样:
public class MyService : System.Web.Services.WebService {
...
[WebMethod(CacheDuration = 30, Description = "This does something", MessageName = "GetMyStuff")]
public XmlDocument GetMyStuff(string param) {
return doGetStuff(param)
} …Run Code Online (Sandbox Code Playgroud) .net web-services byte-order-mark sharepoint-2007 character-encoding
我正在一个网站上工作,虽然在Firefox上显示它很好,在IE上我遇到了很多问题.我使用了w3c验证器,我遇到了很多奇怪的错误.
这是该网站的链接:http://misenplacecatering.it/
我认为最相关的第一个验证错误是:
Byte-Order Mark found in UTF-8 File. The Unicode Byte-Order Mark (BOM) in UTF-8 encoded files is known to cause problems for some text editors and older browsers. You may want to consider avoiding its use until it is better supported.
Run Code Online (Sandbox Code Playgroud)
和
Line 1, Column 1: Non-space characters found without seeing a doctype first. Expected <!DOCTYPE html>.
Run Code Online (Sandbox Code Playgroud)
我已经阅读了有关此问题的其他主题,因此我尝试使用不同的编辑器打开该文件(无论如何我总是使用Vim),但在doctype定义之前我没有看到任何空格或任何其他内容.我甚至使用notepad ++并使用了一个选项来删除bom,但没有.
有什么建议?
无论如何,
我想在一个简短的C#应用程序中使用一个公共Web服务:http: //ws.parlament.ch/
从此Web服务返回的XML在开头有一个"BOM",这会导致RESTSharp无法通过以下错误消息对XML进行反序列化:
检索响应时出错.查看内部细节以获取更多信息.---> System.Xml.XmlException:根级别的数据无效.第1行, 位于System.Xml.XmlTextReaderImpl.Throw(Exception e)
的System.Xml.XmlTextReaderImpl.Throw(String res,String arg),位于System.Xml.XmlTextReaderImpl的System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace()处. System.Xml.Linq.XDocument.Parse上的System.Xml.Linq.XDocument.Load(XmlReader reader,LoadOptions选项)中的System.Xml.XmlTextReaderImpl.Read()处的ParseDocumentContent()(String text,LoadOptions options)
在RestSharp.RestClient.Deserialize [T](IRestRequest请求,IRestResponse raw)的RestSharp.Deserializers.XmlDeserializer.Deserialize [T](IRestResponse响应)的System.Xml.Linq.XDocument.Parse(String text)
---结束内部异常堆栈跟踪---
以下是使用http://ws.parlament.ch/sessions?format=xml获取" 会话 " 列表的简单示例:
public class Session
{
public int Id { get; set; }
public DateTime? Updated { get; set; }
public int? Code { get; set; }
public DateTime? From { get; set; }
public string Name { get; set; }
public DateTime? To { get; set; }
}
static void Main(string[] args) …Run Code Online (Sandbox Code Playgroud) 我最近注意到Python在使用utf-8-sig编码附加到文件时表现得非常明显.见下文:
>>> import codecs, os
>>> os.path.isfile('123')
False
>>> codecs.open('123', 'a', encoding='utf-8-sig').write('123\n')
>>> codecs.open('123', 'a', encoding='utf-8-sig').write('123\n')
Run Code Online (Sandbox Code Playgroud)
以下文本以文件结尾:
<BOM>123
<BOM>123
Run Code Online (Sandbox Code Playgroud)
这不是一个bug吗?这是不合逻辑的.任何人都可以向我解释为什么会这样做?为什么不在文件不存在且需要创建时才设置BOM?
我正在使用MD5功能和Base64编码生成用户密码(用于登录所用API的数据层)
我在javascript中完成了代码并且很好,但是在Objective C中,我对BOM很感兴趣
我的代码是:
NSString *str = [[NSString alloc]
initWithFormat:@"%@%@%@%d",
[auth uppercaseString],
[user uppercaseString],
[pwd uppercaseString],
totalDaysSince2000];
NSString *sourceString = [[NSString alloc] initWithFormat:@"%02x%02x%02x%@",
0xEF,
0xBB,
0xBF,
str];
NSString *strMd5 = [sourceString MD5];
NSData *sourceData = [strMd5 dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64EncodedString = [[sourceData base64EncodedString] autorelease];
Run Code Online (Sandbox Code Playgroud)
使用上面的代码我进入内存:
替代文字http://www.balexandre.com/temp/2010-04-06_1523.png
女巫不是我真正需要的......
我甚至尝试过
"%c%c%c%@", (char)239, (char)187, (char)191, str
Run Code Online (Sandbox Code Playgroud)
没有运气......
使用UTF8String不接缝自动附加BOM,如在C#中:-(
如何正确附加BOM?
在 Java 的错误数据库http://bugs.sun.com/view_bug.do?bug_id=4508058 的一个页面上,它读到 Sun/Oracle 不会解决 Java 不解析 UTF-8 编码字符串的 BOM 的问题。由于此页面上的最新评论可以追溯到 2010 年,我想知道是否有任何更年轻的信息?Java 不能处理 UTF-8 的 BOM 仍然是真的吗?
的字节顺序标记(BOM)为UTF-8是EF BB BF,如在说明中的Unicode 9的部分23.8规范(搜索“签名”)。
Java中的许多解决方案都只是一个简单的一行代码:
replace("\uFEFF", "")
Run Code Online (Sandbox Code Playgroud)
我不明白这为什么有效。
这是我的测试代码。我在调用后检查二进制文件String#replace,我发现 EF BB BF 已被删除。查看此代码在 IdeOne.com 上实时运行。
太神奇了。为什么这样做?
@Test
public void shit() throws Exception{
byte[] b = new byte[]{-17,-69,-65, 97,97,97};//EF BB BF 61 61 61
char[] c = new char[10];
new InputStreamReader(new ByteArrayInputStream(b),"UTF-8").read(c);
byte[] bytes = new StringBuilder().append(c).toString().replace("\uFEFF", "").getBytes();//
for(byte bt: bytes){//61 61 61, we can see EF BB BF is indeed removed
System.out.println(bt);
}
}
Run Code Online (Sandbox Code Playgroud) 红宝石 2.6.3。
我一直在尝试将StringIO对象解析为CSV具有bom|utf-8编码的实例,以便去除 BOM 字符(不需要的)并将内容编码为 UTF-8:
require 'csv'
CSV_READ_OPTIONS = { headers: true, encoding: 'bom|utf-8' }.freeze
content = StringIO.new("\xEF\xBB\xBFid\n123")
first_row = CSV.parse(content, CSV_READ_OPTIONS).first
first_row.headers.first.include?("\xEF\xBB\xBF") # This returns true
Run Code Online (Sandbox Code Playgroud)
显然bom|utf-8编码不适用于StringIO对象,但我发现它适用于文件,例如:
require 'csv'
CSV_READ_OPTIONS = { headers: true, encoding: 'bom|utf-8' }.freeze
# File content is: "\xEF\xBB\xBFid\n12"
first_row = CSV.read('bom_content.csv', CSV_READ_OPTIONS).first
first_row.headers.first.include?("\xEF\xBB\xBF") # This returns false
Run Code Online (Sandbox Code Playgroud)
考虑到我需要StringIO直接使用,为什么CSV忽略bom|utf-8编码?有没有办法从StringIO实例中删除 BOM 字符?
谢谢!
我正在尝试通过以下方式重定向 PowerShell 中的输入:
Get-Content input.txt | my-program args
Run Code Online (Sandbox Code Playgroud)
问题是管道 UTF-8 文本前面有一个 BOM (0xEFBBBF),我的程序无法正确处理它。
一个最小的工作示例:
// File: Hex.java
import java.io.IOException;
public class Hex {
public static void main(String[] dummy) {
int ch;
try {
while ((ch = System.in.read()) != -1) {
System.out.print(String.format("%02X ", ch));
}
} catch (IOException e) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在 PowerShell 中:
javac Hex.java
Set-Content textfile "ABC" -Encoding Ascii
# Now the content of textfile is 0x41 42 43 0D 0A
Get-Content textfile | java Hex
Run Code Online (Sandbox Code Playgroud)
或者干脆 …
byte-order-mark ×10
utf-8 ×6
c# ×2
java ×2
.net ×1
cocoa-touch ×1
csv ×1
encoding ×1
html ×1
objective-c ×1
pipe ×1
powershell ×1
python ×1
restsharp ×1
ruby ×1
ruby-csv ×1
web-services ×1
xmlreader ×1