VS2017 C++使用libcurl发JSON POST到Zendesk时Umlauts乱码为问号
问题根因
你遇到的字符乱码问题核心是Windows环境下字符串默认编码和服务端要求的UTF-8编码不匹配,Postman和VS/Windows原生curl的差异如下:
- Postman内部所有字符串、请求payload默认使用UTF-8编码处理,发送的字节流完全符合Zendesk的编码要求,因此不会出现乱码。
- Windows系统默认本地编码(德语区通常为Windows-1252,国内为GBK),VS编译C代码时,默认会把源码中的字符串字面量
TestÜÄÖ转换为本地编码的字节存储,你发送的实际payload字节不是UTF-8格式,Zendesk按UTF-8解析失败就会将无法识别的字符替换为?。 - 你之前添加charset的操作未生效,大概率是请求头格式错误,且就算头配置正确,payload本身编码错误也无法解决问题。
解决方案
VS项目配置修改
- 强制VS编译器使用UTF-8处理字符串字面量:打开项目属性→
C/C++→命令行→附加选项,添加编译参数/utf-8,保存后重新编译即可。 - 修正请求头配置,将原有
Content-Type: application/json替换为Content-Type: application/json; charset=utf-8,明确告知服务端编码格式。
兜底兼容方案
如果不想修改项目编译配置,可以直接将Umlauts特殊字符替换为JSON标准的Unicode转义序列:
Ü对应\u00DCÄ对应\u00C4Ö对应\u00D6
修改后的payload字符串为:
const char *data = "{ \"user\": {\"external_id\": \"160102\", \"name\" : \"Test\u00DC\u00C4\u00D6\", \"phone\": \"014567-0\", \"user_fields\": { \"anrede\": \"Herr\"}, \"organization\":{\"name\":\"testorg\"}, \"email\" : \"\"} }";
该方案不受源码、编译编码影响,兼容性更强。
Windows cmd curl乱码修复
cmd默认使用系统本地代码页,执行curl前先运行命令chcp 65001切换到UTF-8代码页,再执行curl命令即可正常发送特殊字符。
内容的提问来源于stack exchange,提问作者Juri D
相关产品推荐
相关产品推荐

