我试图插入XML列(SQL SERVER 2008 R2),但服务器的抱怨: System.Data.SqlClient.SqlException(0x80131904): XMLparsing:行1,字符39,无法切换编码 我发现为了插入成功,XML列必须是UTF-16。 我使用的代码是: XmlSerializer serializer = new XmlSerializer(typeof(MyMessage)); StringWriter str = new StringWriter(); serializer.Serialize(str, message); string messageToLog = str.ToString(); 我如何序列化对象是UTF-8string? 编辑 :好的,抱歉的混合 – string需要在UTF-8。 你是对的 – 默认情况下是UTF-16,如果我尝试以UTF-8插入,它会通过。 所以问题是如何序列化成UTF-8。 例 尝试插入到SQL Server时,这会导致错误: <?xml version="1.0" encoding="utf-16"?> <MyMessage>Teno</MyMessage> 这不: <?xml version="1.0" encoding="utf-8"?> <MyMessage>Teno</MyMessage> 更新 我想出了当它的Xml列types的SQL Server 2008需要utf-8时,以及当你尝试插入的xml规范的encoding属性中的utf-16: 当你想添加utf-8 ,然后像下面这样向SQL命令添加参数: sqlcmd.Parameters.Add("ParamName", SqlDbType.VarChar).Value = xmlValueToAdd; […]
从这里 本质上,string使用UTF-16字符编码forms 但是,当保存vs StreamWriter时 : 这个构造函数创build一个没有字节顺序标记(BOM)的UTF-8编码的StreamWriter, 我已经看到这个样本(断开的链接删除): 它看起来像utf8是一些string较小而utf-16在一些其他string较小。 那么为什么.net使用utf16作为string的默认编码,而utf8保存文件? 谢谢。 我已经阅读了这篇着名的文章
这里有两个问题。 我有一套通常是带有BOM的UTF-8的文件。 我想将它们(理想情况下)转换为UTF-8,不含BOM。 看起来像codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors)将处理此。 但是我没有看到使用过程中的任何好例子。 这是处理这个问题的最好方法吗? source files: Tue Jan 17$ file brh-m-157.json brh-m-157.json: UTF-8 Unicode (with BOM) text 另外,如果我们能够处理不同的input编码而不明确地知道(见ASCII和UTF-16),那将是理想的。 看来这应该都是可行的。 是否有解决scheme,可以采取任何已知的Python编码和输出为UTF-8没有BOM? 编辑1从下面sol'n(谢谢!) fp = open('brh-m-157.json','rw') s = fp.read() u = s.decode('utf-8-sig') s = u.encode('utf-8') print fp.encoding fp.write(s) 这给了我以下错误: IOError: [Errno 9] Bad file descriptor 新闻快报 我被告知在评论中,错误是我用模式'rw'而不是'r +'/'r + b'打开文件,所以我最终应该重新编辑我的问题,并删除解决的部分。
我从来没有理解UTF-16编码的重点。 如果需要将string视为随机访问(即代码点与代码单元相同),则需要UTF-32,因为UTF-16的长度仍然是可变的。 如果你不需要这个,那么与UTF-8相比,UTF-16似乎是一个巨大的空间浪费。 UTF-16与UTF-8和UTF-32相比有什么优势?Windows和Java为什么使用它作为它们的本地编码?
Big Endian和Little Endian字节顺序有什么区别? 这两个似乎都与Unicode和UTF16相关。 我们到底在哪里使用这个?
我一直在阅读Unicode的主题 – 特别是在C ++ 11中的UTF-8(非)支持,我希望Stack Overflow的专家能够向我保证我的理解是正确的,或者指出我误解的地方或错过的地方。 一个简短的总结 首先,你可以在源代码中定义UTF-8,UTF-16和UCS-4文字。 此外, <locale>头文件包含了几个可以在UTF-8,UTF-16,UCS-4和平台多字节编码之间进行转换的std::codecvt实现(尽pipeAPI看起来很温和,但小于直截了当)。 这些codecvt实现可以imbue()在stream上,以便在读取或写入文件(或其他stream)时进行转换。 [ 编辑: Cubbi指出,我忽略了提及<codecvt>标题,它提供了不依赖于语言环境的std::codecvt实现。 此外, std::wstring_convert和wbuffer_convert函数可以使用这些codecvt来直接转换string和缓冲区,而不依赖于stream。] C ++ 11还包括C99 / C11 <uchar.h>头文件,其中包含将平台多字节编码(可能是也可能不是UTF-8)的单个字符转换成UCS-2和UCS-4的函数。 但是,这是关于它的程度。 虽然你当然可以将UTF-8文本存储在std::string ,但是我没有办法看到对它做任何有用的事情。 例如,除了在你的代码中定义一个文字,你不能validation一个字节数组是否包含有效的UTF-8,你不能找出长度(即Unicode字符的数量,对于“字符” )包含一个UTF-8的std::string ,并且不能以字节为单位以任何方式迭代std::string 。 同样,即使C ++ 11增加了std::u16string也不是真的支持UTF-16,而只是老的UCS-2 – 它不支持代理对,只留下了BMP。 意见 鉴于UTF-8是几乎所有Unix派生系统(包括Mac OS X和 * Linux)上处理Unicode的标准方法,并且已经基本成为网上事实上的标准,所以在现代C ++中缺乏支持像一个非常严重的遗漏。 即使在Windows上,新的std::u16string并不真正支持UTF-16的事实似乎有些遗憾。 *正如在评论中指出的,在这里明确指出,Mac OS的BSD派生部分使用UTF-8,而Cocoa使用UTF-16。 问题 如果您设法阅读所有这些,谢谢! 只是几个简单的问题,因为这是堆栈溢出毕竟… 上面的分析是否正确,或者是否有其他Unicode支持设施? 在过去几年中,标准委员会在推动C ++向前发展方面做了出色的工作。 他们都是聪明的人,我认为他们很清楚上述缺点。 是否有一个众所周知的原因,Unicode支持在C ++中仍然很差? outlook未来,有没有人知道有什么scheme可以纠正? 快速searchisocpp.org似乎没有透露任何东西。 […]
我正在努力获得Unicodestring的计数,并尝试各种选项。 看起来像一个小问题,但大大的打击。 在这里,我正在尝试获取stringstr1的长度。 我得到它为6.但实际上是3.移动光标在string“குமார்”也显示为3个字符。 基本上我想测量的长度和打印每个字符。 如“கு”,“ாா”,“ர்”。 public class one { public static void main(String[] args) { String str1 = new String("குமார்"); System.out.print(str1.length()); } } PS:这是泰米尔语。
我正在阅读StringBuffer的文档,特别是reverse()方法。 那个文件提到了关于代理对的一些事情。 在这方面什么是代理对? 什么是低和高代理?
UTF-8和UTF-16的区别? 为什么我们需要这些? MessageDigest md = MessageDigest.getInstance("SHA-256"); String text = "This is some text"; md.update(text.getBytes("UTF-8")); // Change this to "UTF-16" if needed byte[] digest = md.digest();
Unicode的基础是什么,为什么需要UTF-8或UTF-16? 我在Google上研究过这个,也在这里search,但是对我来说还不清楚。 在VSS做文件比较的时候,有时候会有消息说这两个文件有不同的UTF。 为什么会这样呢? 请简单说明一下。