【问题标题】:How to read a UTF-8 character with External Table correctly如何正确读取带有外部表的 UTF-8 字符
【发布时间】:2019-03-14 10:49:11
【问题描述】:

我有一个用 uft8 编码的 CSV 文件。记录的某个字段中有文字

在文本中是用两个字符编码的字符。 例如在Österreich这个词中 字符Ö 被编码为O¨ 而不是Ö

如果我在编辑器中打开文件,我会看到正确的单词Österreich

如果我通过选择外部表来查看文件,那么我会看到O¨sterreich

在创建外部表时,我已经添加了访问参数CHARACTERSET AL32UTF8

ACCESS PARAMETERS (
 RECORDS DELIMITED BY NEWLINE 
 CHARACTERSET AL32UTF8 
 STRING SIZES ARE IN BYTES  
 skip 1
 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LDRTRIM 
 MISSING FIELD VALUES ARE NULL   
)

是否有可能或参数告诉oracle将输出中的两个字符合并为一个?

【问题讨论】:

  • 根据 Unicode 标准,您应该始终使用尽可能短的代码点,即 Ö (U+00D6) 而不是 (U+004F U+0308)。运行SELECT DUMP(..., 1016) FROM ... 会得到什么?确保您有字符 U+0308 COMBINING DIAERESIS 而不是 U+00A8 DIAERESIS。很可能您的客户端应用程序没有正确显示它。许多客户端难以显示组合的 Unicode 字符。
  • @WernfriedDomscheit, 查询结果为Typ=1 Len=11 CharacterSet=WE8MSWIN1252: 4f,a8,73,74,65,72,72,65,69,63,68
  • 我怎样才能确保这一点(U + 0308 COMBINING DIAERESIS)?
  • 我从c# 应用程序中的外部表中读取数据并生成pdf。只是尝试这样做,文本在O¨sterreich而不是Österreich之前提到。所以这不仅是我客户的一个令人不安的“问题”。我们从客户那里得到了文件。现在这不是一个大问题,客户正在向我们提供不同编码的文件。有趣的是,如果这可以用外部表解决
  • 看起来在您的 CSV 文件中确实有 - 实际上是两个不同的单个字符,而不是 Ö。您应该以包含正确内容的方式编辑 CSV 文件。

标签: sql oracle utf-8 character-encoding external-tables


【解决方案1】:

看起来 Oracle 外部表无法将 U+004F U+0308 正确转换为单个 Ö

如果您将数据库从 WE8MSWIN1252 迁移到 AL32UTF8 (UTF-8),我认为结果会很好,请参阅 https://docs.oracle.com/database/121/NLSPG/ch11charsetmig.htm#NLSPG011

或者修改CSV文件,将字符U+004F U+0308替换为U+00D6,称为Unicode Normalization

你也可以看看Characters and Combining Marks

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    相关资源
    最近更新 更多