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

前端之家收集整理的这篇文章主要介绍了sql-server – 如何去除希伯来语重音符号前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要一个字符编码技巧去除希伯来语口音标记.

之前的样品

בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ

样品之后

בראשית ברא אלהים את השמים ואת הארץ

解决方法

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

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

基本字母“ה”=“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/(与希伯来字符集中的所有角色一起玩;非常酷!)

猜你在找的MsSQL相关文章