Tcl、SQLite 或任何其他语言中希伯来语的 Unicode 规范化将在 Linux OS 中起作用

Unicode normalization of Hebrew in Tcl, SQLite, or whatever else will work in Linux OS

我正在尝试在 SQLite 中对包括元音点和悬音标记在内的希伯来语单词执行连接,看起来被连接的源以不同的顺序构建组件,因此最终的 strings/words 在屏幕,但在应该匹配时却无法匹配。我很确定所有来源都是 UTF-8。

我没有在 SQLite 中看到内置的 unicode 规范化方法,这将是最简单的解决方案;但发现 link of Tcl Unicode 但使用 Tcl 8.3 和 Unicode 1.0 看起来有点旧。这是在 Tcl 中规范化 unicode 的最新方法吗?它是否适合希伯来语?

如果 Tcl 没有适用于希伯来语的可行方法,是否有用于处理希伯来语的首选脚本语言可用于生成用于连接的规范化字符串?我正在使用 Manjaro Linux 但我对其中的大部分内容还是个新手。

我有能力使用 JavaScript、浏览器扩展和 SQLite C API 将数据从 C 传递到浏览器以进行规范化,然后再返回以存储在数据库中;但我认为可能有更好的方法。我指的是浏览器,因为我认为它们出于显而易见的原因保持最新状态。

感谢您提供的任何指导。


我使用以下代码试图使@DonalFellows 提供的过程成为一个 SQLite 函数,这样它就接近于不将数据导入 Tcl。我不确定 SQLite 函数在这方面是如何工作的,但这就是我尝试它的原因。我使用 foreach 循环只是为了打印一些指示,表明查询正在 运行 并且正在进行中,因为它需要大约一个小时才能完成。

不过,这对我用了 10 年的旧机器来说可能相当不错,而且它 运行 支持 1) 带有元音点的希伯来语,2) 带有元音点和悬音标记,以及 3) 七十士译本t运行旧约所有三十九本书的希伯来文版本,然后是新约所有二十七本书的两份不同的希腊语手稿。

我仍然需要 运行 对其他两个来源进行标准化,以了解整体效果如何;然而,在 运行 在这三个中最复杂的一个上使用它之后,我 运行 再次加入并且匹配的数量几乎翻了一番。

proc normalize {string {form nfc}} {
    exec uconv -f utf-8 -t utf-8 -x "::$form;" << $string
}
# Arguments are: dbws function NAME ?SWITCHES? SCRIPT
dbws function normalize -returntype text -deterministic -directonly { normalize }

foreach { b } { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 } {
  puts "Working on book $b"
  dbws eval { update src_original set uni_norm = normalize(original) where book_no=$b }
  puts "Completed book $b"
}

如果不着急,可以通过uconv传递数据。不过,在处理非规范化数据时需要小心; Tcl 对输入和输出的格式转换非常积极。 (只是……与规范化无关;规范化表 庞大 并且大多数代码不需要这样做。)

proc normalize {string {form nfc}} {
    exec uconv -f utf-8 -t utf-8 -x "::$form;" << $string
}

上面的代码只适用于系统编码为 UTF-8 的系统……但几乎所有以 uconv 开头的系统都是如此。

有用的规范化形式有:nfcnfdnfkcnfkd。选择一个并强制将所有文本都包含在其中(理想情况下是在摄取到数据库中......但我在这方面看到了太多损坏的数据库,我建议要小心)。