XML文档如下:...文件必须以UTF-8编码... 姓氏字段仅允许(扩展)ASCII... 城市仅允许ISOLatin1... 消息必须作为IBytesMessage放在(IBM Websphere)消息队列中
<?xml version="1.0" encoding="utf-8"?>
<foo>
<lastname>John ÐØë</lastname>
<city>John ÐØë</city>
<other>UTF-8 string</other>
</foo>
"ÐØë" 部分是(或应该是) ASCII 值 208、216、235。
我还有一个对象:
public class foo {
public string lastname { get; set; }
}
所以我实例化一个对象并设置姓氏:
var x = new foo() { lastname = "John ÐØë", city = "John ÐØë" };
现在这里就是我的头痛之处(或者你可以说是梦中的梦……):
- Visual Studio / 源代码使用的是Unicode
- 因此:对象有一个Unicode的姓氏
- XML序列化器使用UTF-8来编码文档
- 姓氏应该只包含(扩展)ASCII字符;这些字符是有效的ASCII字符,但当然是以UTF-8编码形式存在
通常我不会遇到任何编码问题;我熟悉软件开发人员绝对必须知道的有关Unicode和字符集的绝对最低限度(没有借口!),但这个问题让我束手无策……
我明白UTF-8文档可以“包含”两种编码,因为代码点“重叠”。但是当我需要将序列化的消息转换为字节数组时,我就迷失了。在进行转储时,我看到C3 XX C3 XX C3 XX
(我手头没有实际的转储)。很明显(或者我看得太久了),姓氏/城市字符串以其Unicode形式放入序列化文档中;字节数组表明如此。
现在,我需要在哪里做什么才能确保Lastname字符串作为 ASCII 字符串(以及实际的208、216、235字节序列)进入XML文档和最终的字节数组,并且City作为 ISOLatin1 ?
我知道要求是反向的,但我无法改变这些要求(第三方)。我总是为我们的内部项目使用UTF-8,因此我必须支持unicode-utf8 => ASCII / ISOLatin1转换(当然,仅适用于这些集合中的字符)。
我的头疼了...