之前的样品
בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ
样品之后
בראשית ברא אלהים את השמים ואת הארץ
解决方法
>元音(通常在字母下面的线和点):
基本字母“ה”=“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/(与希伯来字符集中的所有角色一起玩;非常酷!)