尝试在PL/SQL过程中检测非法XML字符

Mar*_*ven 5 xml unicode ascii plsql

这是一个益智游戏.我想编写一个过程来检查表中是否存在破坏XML代码的任何字符.这些可以在W3C建议书中找到,但现在这并不重要.重要的是:

1)字符'ç'的ASCII码为135.这是事实.但是,当我跑

begin
  ascii('ç');
end;

我得到50087.

2)当我跑

begin
  dbms_output.put_line(chr(135));
end;

我得到pure nothing.

显然,ascii()和chr()只处理0..127中的值.所以我的问题是如何找到unicode等价物或编写我自己的扩展,使用'ç'和135等值.

将非常感谢帮助.

PS我正在使用Oracle SQL Developer.

col*_*sar 2

处理任意字符集的 plsql 函数(就 RDBMS 所知)位于包 utl_i18n 和 utl_raw 中。对于您的具体问题,我建议进行如下测试:

    select <pk_column_of_table_to_check>
         , instr (
              utl_i18n.string_to_raw ( 
                   <column_to_test>
                 , 'UTF8'
              )
            , hextoraw ( <hex_rep_in_utf8>  )
           )
      from <table_to_check>
         ;
Run Code Online (Sandbox Code Playgroud)

如果您想检查 utf8 表示形式不可用的 unicode 字符,请使用术语

      utl_raw.convert ( hextoraw ( <hex_rep_in_utf16>, 'UTF16', 'UTF8' ) )
Run Code Online (Sandbox Code Playgroud)

作为 instr 的第二个参数。不依赖于 instr 返回的绝对位置,而只依赖于二分法 0/非 0,因为您不是按字符进行比较,而是按字节级别进行比较。

utf8 和 utf16 是命名字符实体意义上的 unicode 字符集的 2 种不同的字节级编码;详细信息可以在 wikipedia 和 unicode.org 上找到

请注意,utf8 表示形式允许按设计进行字节级包含测试。另请注意,utf16 编码应该很容易获得,因为它是大家熟悉的 unicode 字符的 U+<4 十六进制数字> 表示形式。

相关字符的字节级表示应可从 (xml) 标准获得。否则,您必须了解 char 的命名方式,并在 unicodde.org 或 aomeweher 其他的代码点数据库中查找它。如果您只知道字符集名称,但系统上的文件中有一些文本示例,还有在线转换工具,如果需要,我可以查找 uri。

希望这可以帮助。

PS:在更准确地阅读您的第一条评论后,我认为您可能会发现自己面临着一项不可能完成的任务:要正确解释单字节字符集编码的字节序列,保持有关正在使用的字符集的信息是必不可少的。当用户将文本从文字处理器(设置为特定的字符集[编码])复制到数据库(它将存储在数据库字符集中)时,只要复制字节序列,该信息不会丢失吗?当两端都设置为 unicode 风格或数据库字符集编码为 utf8 时(因此某些字符复制将失败),您可能会很幸运,但是一旦数据进入数据库,您将很难恢复原始数据(也许有字典支持)