加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 如何去除希伯来语重音符号

发布时间:2020-12-24 10:53:09 所属栏目:MsSql教程 来源:网络整理
导读:我需要一个字符编码技巧去除希伯来语口音标记. 之前的样品 ???????????? ??????? ????????? ???? ???????????? ?????? ???????? 样品之后 ?????? ??? ????? ?? ????? ??? ???? 解决方法 这里的诀窍是要意识到你在问题中用“口音”看到的这些字符并不是真正

我需要一个字符编码技巧去除希伯来语口音标记.

之前的样品

???????????? ??????? ????????? ???? ???????????? ?????? ????????

样品之后

?????? ??? ????? ?? ????? ??? ????

解决方法

这里的诀窍是要意识到你在问题中用“口音”看到的这些字符并不是真正的字符(即“这些不是你正在寻找的机器人字符”;-)). “口音”是各种类型的符号,表示如下:

>元音(通常在字母下面的线和点):

基本字母“?”=“h”; “??”=“heh”和“??”=“hah”
>发音(通常在字母内部或上方的点):

“??”=“b”vs“?”=“v”,或“??”=“s”vs“??”=“sh”
>标点符号
>蒸馏(如何唱)

实际的希伯来字母是在精简版中显示的(即这里要求的最终结果).我们在这里所说的“口音”被称为变音符号.关于这些标记的维基百科文章有很多关于这些标记的好信息,包括以下图像和标题:

创世纪1:9上帝说:“要收集水”.
黑色的信件,指向红色,蓝色的蒸馏

从那些基本字符到第一行(带元音等)显示的是添加一个或多个“重音”的问题. Unicode(SQL Server中的UTF-16,尽管默认解释仅处理UCS-2 /基本多语言平面(BMP)代码点)允许某些字符在与它们相邻时覆盖另一个非重叠字符.这些被称为Combining Characters.

含义:

SELECT DATALENGTH(N'???'); -- character taken from original given text

返回:

6

大多数人都不希望看到单个双字节字符.所以也许我们试着通过这样做来找到那里的角色:

SELECT UNICODE(N'???');

返回:

1502

当然,UNICODE和ASCII函数只返回给定的任何字符串的第一个字符的INT值.但是1502的值仅覆盖2个字节,其中4个字节未计入.查看同一个希伯来语“字符”的二进制/十六进制值:

SELECT NCHAR(1502),CONVERT(BINARY(2),UNICODE(N'???')),CONVERT(VARBINARY(10),N'???');

我们得到:

?
0x05DE  0xDE05B7059605

现在,0x05DE是1502的十六进制表示,1502只是“?”.下一部分可以分为三个2字节集:DE05 B705 9605.现在,Unicode字符串值存储在Little Endian中,这意味着字节顺序是相反的.如果我们切换这三组中的每一组,我们得到:

05DE(基本字符)05B7 0596(未计入4个字节).

好.那么如果我们删除那个基本字符会发生什么?

SELECT REPLACE(N'???' COLLATE Hebrew_BIN2,NCHAR(1502) COLLATE Hebrew_BIN2,'');

这将返回剩余的两个字符(这里不容易看到,所以为了增加字体大小,我将以下行作为标题;您还可以运行上面的REPLACE来查看它们):

从??中删除??会在底部留下两个字符:??

因此,我们需要删除每个单独的代码点,这些代码点是这些“额外”组合字符之一(见于:http://unicode-table.com/en/search/?q=hebrew),这将留下我们的基本字符.我们可以这样做:

CREATE FUNCTION dbo.RemoveHebrewAccents (@txeTwerbeH NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
WITH SCHEMABINDING
AS
BEGIN

  WITH base (dummy) AS
  (
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
  ),nums AS
  (
    -- we will want to generate code points 1425 - 1479
    SELECT TOP (55) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS [Num]
    FROM   base b1
    CROSS JOIN base b2
  )
  SELECT @txeTwerbeH = REPLACE(
                               @txeTwerbeH COLLATE Hebrew_BIN2,NCHAR(1424 + nums.[Num]) COLLATE Hebrew_BIN2,''
                              )
  FROM   nums;

  RETURN @txeTwerbeH;
END;

然后我们可以用原始文本测试它,如下所示:

DECLARE @Hebrew NVARCHAR(200) = N'???????????? ??????? ????????? ???? ???????????? ?????? ????????';

SELECT dbo.RemoveHebrewAccents(@Hebrew);

返回:

????????????????????????????

补充说明:

>从技术上讲,64298和64334之间有一组代码点,它们在字符中内置了一些元音和发音“重音符号”.如果需要处理这些,那么这可能是函数中的第二步,可以简单地替换这些字符.
>似乎这些重音符号,标点符号等代码点仅在使用二进制排序规则时匹配.即使使用Hebrew_100_CS_AS_KS_WS_SC也不匹配.但以下确实有效:Hebrew_BIN,Hebrew_BIN2,Latin1_General_BIN和Latin1_General_BIN2.在函数中我最终使用了Hebrew_BIN2.请注意,使用二进制排序规则时,除非您特别需要使用旧的_BIN排序规则,否则您应该只使用较新的_BIN2排序规则.
>对于任何好奇的人,希伯来文的示例文本实际上是Bereishis 1:1(这也是右边的第一个单词,因为希伯来语是从右到左阅读的;在英语中它将是“创世纪1:1”虽然这不是单词的直接翻译,但只是托拉/圣经第一本书的名称;直接翻译是“在开头”):

In the beginning of God’s creating the heavens and the Earth

> 2015-01-19:我找到了一些很好的资源来解释组合字符和希伯来字符集:

> http://en.wikipedia.org/wiki/Combining_character(也链接到这个答案的顶部)
> http://www.alanwood.net/unicode/combining_diacritical_marks.html
> http://www.alanwood.net/unicode/hebrew.html
> http://people.w3.org/rishida/scripts/pickers/hebrew/(与希伯来字符集中的所有角色一起玩;非常酷!)

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读