Apex中中日文字符查询后在类中显示为问号的问题求助
Salesforce字段读取日文显示问号的排查方案
问题场景
Contact对象的LocaleName__c字段存储值为会社 エフ,执行SOQL查询后直接调用System.debug能正常输出日文,但在类中后续使用该字段值时,输出变为test-??????。
可能原因及解决步骤
1. 编码上下文不一致
- 排查后续使用该字段的场景:如果将字段值传入第三方集成接口、自定义字符串处理方法,或者输出到非UTF-8编码的终端/系统,会导致日文字符被替换为问号。
- 检查代码中是否存在错误的编码转换操作,比如误用
EncodingUtil.convertToHex或手动转ASCII编码,这些操作会破坏多字节的日文字符。
2. 数据处理时的隐式转换或截断
- 确认
LocaleName__c的字段类型为Text/Long Text Area:如果是公式字段,检查公式逻辑是否正确返回字符串类型,避免因类型转换丢失编码。 - 排查字符串处理代码:若使用
substring、replace等方法,确保是按字符数而非字节数处理。日文属于多字节字符,按字节截断会破坏编码结构,导致乱码。
3. 输出渠道的编码限制
- 对比
System.debug和类中输出的渠道:Salesforce原生debug日志默认支持UTF-8,但如果是自定义日志对象、外部系统日志,需确认目标系统是否开启UTF-8编码支持。 - 若输出到外部服务,需在请求头中指定
Content-Type: application/json; charset=utf-8(或对应格式的UTF-8声明)。
4. 变量赋值或作用域问题
- 在使用字段值的前一行添加debug,定位乱码出现的节点:
// 定位问题节点的debug代码 System.debug('Pre-usage value: ' + ct.LocaleName__c); String result = 'test-' + ct.LocaleName__c; System.debug('Post-concat value: ' + result); - 检查是否存在变量被意外覆盖的情况,比如后续代码重新给
ct.LocaleName__c赋值了错误内容。
快速验证方案
先通过分步debug确认字段值在哪个环节开始变乱码:如果debug输出始终正常,但最终输出到外部系统时变问号,直接调整目标系统的编码设置;如果debug中就出现乱码,排查数据处理逻辑。
内容的提问来源于stack exchange,提问作者skm
相关产品推荐
相关产品推荐

