C#中如何将含Unicode的字符串转为SOAP短信所需十六进制NCR格式?
解决ASCII+Unicode字符串转十六进制NCR格式及SOAP设置问题
核心转换逻辑
要完成混合字符的NCR转换,核心是逐个处理字符串中的每个字符:
- ASCII字符(码点0~127):可直接保留原字符(SOAP原生支持,且多数第三方接口允许);若接口要求所有字符都转NCR,也统一处理即可。
- 非ASCII字符(码点>127):将字符的Unicode码点转为十六进制,格式化为
&#xHHHH;(HHHH为4位或更长的十六进制值,如emoji这类超出U+FFFF的字符会用6位)。
代码实现示例
Python版本(简洁高效)
def convert_to_ncr(text): result = [] for char in text: code = ord(char) if code <= 127: result.append(char) else: # 转十六进制,去掉前缀0x,自动适配字符长度 hex_code = hex(code)[2:] result.append(f'&#x{hex_code};') return ''.join(result)
测试案例:
输入:"Hello 世界!😀"
输出:"Hello 世界!😀"
如果接口要求所有字符都转NCR,去掉判断逻辑即可:
def convert_all_to_ncr(text): return ''.join([f'&#x{hex(ord(c))[2:]};' for c in text])
Java版本
public class NcrConverter { public static String convertToNcr(String text) { StringBuilder sb = new StringBuilder(); for (char c : text.toCharArray()) { int codePoint = (int) c; if (codePoint <= 127) { sb.append(c); } else { sb.append("&#x").append(Integer.toHexString(codePoint)).append(";"); } } return sb.toString(); } }
SOAP请求中的设置
- DataCoding字段:在SOAP信封的请求参数里,将
DataCoding的值设为2,比如:
<soapenv:Envelope ...> <soapenv:Body> <SendSMSRequest> <DataCoding>2</DataCoding> <MessageContent>Hello 世界!</MessageContent> <!-- 其他参数:手机号、发送时间等 --> </SendSMSRequest> </soapenv:Body> </soapenv:Envelope>
- 编码注意:确保SOAP请求的Content-Type设置为
text/xml; charset=utf-8,避免字符编码混乱。
注意事项
- 十六进制字母的大小写:多数接口不区分大小写(如
世和世都可),若有明确要求按第三方文档调整。 - 特殊字符:部分ASCII控制字符(如换行、制表符)可能也需要转义,若遇到发送失败的情况,可尝试将这类字符也转为NCR格式。
内容的提问来源于stack exchange,提问作者user2399378
相关产品推荐
相关产品推荐

