西里尔字符在 Oracle 上的 XML 中无法正确显示

Cyrillic characters are not displayed correctly in XML on Oracle

提问人:Gontar 提问时间:7/10/2023 最后编辑:marc_sGontar 更新时间:7/10/2023 访问量:50

问:

我有 DB Oracle 19c。

NLS:

参数 价值
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_CHARACTERSET AL32UTF8

创建 XML:

SELECT xmlroot(xmlagg(xmlelement("MA",
                                 xmlforest(1 "STATUS",
                                           v.app_type "APP_TYPE",
                                           v.fname "FNAME",
                                           v.pname "PNAME",
                                           v.lname "LNAME",
                                           v.dob "DOB",
                                           v.dob_od "DOB_OD",
                                           v.pob "POB",
                                           v.inc_tm "INC_TM",
                                           v.gender "GENDER",
                                           v.educ_lvl "EDUC_LVL",
                                           v.marit_st "MARIT_ST",
                                           v.kids "KIDS"))),
               version '1.0" encoding="UTF-8') AS xml
FROM nh_data_vector v
WHERE v.id_nh = 1

XML 已正确创建并显示。

如果我使用 xmlserialize 和 make blob,那么 сyrillic 字符会中断。

SELECT xmlserialize(document xmlroot(xmlagg(xmlelement("MA",
                                              xmlforest(1 "STATUS",
                                                        v.app_type "APP_TYPE",
                                                        v.fname "FNAME",
                                                        v.pname "PNAME",
                                                        v.lname "LNAME",
                                                        v.dob "DOB",
                                                        v.dob_od "DOB_OD",
                                                        v.pob "POB",
                                                        v.inc_tm "INC_TM",
                                                        v.gender "GENDER",
                                                        v.educ_lvl "EDUC_LVL",
                                                        v.marit_st "MARIT_ST",
                                                        v.kids "KIDS"))),
                            version '1.0" encoding="UTF-8') AS BLOB encoding 'UTF-8'
                    version '1.0') AS xml
FROM nh_data_vector v
WHERE v.id_nh = 1
<MA>
    <STATUS>1</STATUS>
    <APP_TYPE>4</APP_TYPE>
    <FNAME>Р”РњР˜РўР Р˜Р™</FNAME>
    <PNAME>Р’Р›РђР”Р˜РњР˜Р РћР’Р˜Р§</PNAME>
    <LNAME>Р—Р˜РњР˜Рќ</LNAME>
    <DOB>1991-11-20</DOB>
    <DOB_OD>1991-11-20</DOB_OD>
    <POB>ГОР.САРАТОВ</POB>
    <INC_TM>100000</INC_TM>
    <GENDER>1</GENDER>
    <EDUC_LVL>3</EDUC_LVL>
    <MARIT_ST>1</MARIT_ST>
    <KIDS>0</KIDS>
</MA>

在线使用解码器,我看到编码 Windows-1251。但是我如何获得这种编码呢?我需要使用 UTF-8。

我正在使用 ,但它没有帮助。convert()

xml oracle plsql UTF-8

评论

0赞 JosefZ 7/11/2023
你面临一个不寻常的 mojibake 情况(例如在 Python 中具有普遍的可理解性):returns .请注意,result 是 ''' ''' (U+00A0,无换行空格),而 '\x98' 未在 中定义。不知道(U+02DC,小波浪号)是从哪里来的......'ДМИТРИЙ ВЛАДИМИРОВИЧ ЗИМИН'.encode( 'utf-8').decode( 'cp1251', 'backslashreplace').replace( '\\x98', '˜')'Р”РњР˜РўР\xa0Р˜Р™ Р’Р›РђР”Р˜РњР˜Р\xa0РћР’Р˜Р§ Р—Р˜РњР˜Рќ'\xa0cp1251˜

答:

0赞 Wernfried Domscheit 7/10/2023 #1

数据库只是其中的一部分。您还需要告诉数据库您的客户端使用哪个字符集。除非您有基于 Java/JDBC 的客户端,否则这通常由 环境变量 完成。NLS_CHARACTERSETNLS_LANG

请参阅 OdbcConnection 将中文字符返回为“?”