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之间有一组代码点,它们在字符中内置了一些元音和发音“重音符号”.如果需要处理这些,那么这可能是函数中的第二步,可以简单地替换这些字符.
> 2015-01-19:我找到了一些很好的资源来解释组合字符和希伯来字符集: > http://en.wikipedia.org/wiki/Combining_character(也链接到这个答案的顶部) (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |