ヘブライ語のアクセント記号を取り除く方法


17

ヘブライ語のアクセント記号を取り除くには、文字エンコーディングトリックが必要です。

サンプル前

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

サンプル後

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

回答:


26

ここでのコツは、質問で「アクセント」と表示されているこれらのキャラクターが実際にキャラクターではないことを認識することです(つまり、「これらはドロイド探している文字」;-))。「アクセント」は、次のようなものを示すさまざまなタイプの表記法です。

  • 母音(通常、文字の下にある線と点):

    ベース文字 "ה" = "h"; 「הֶ」=「heh」および「הָ」=「hah」

  • 発音(通常、文字の内側または上側にあるドット):

    「בּ」=「b」対「ב」=「v」、または「שׂ」=「s」対「שׁ」=「sh」

  • 句読点

  • カンチレーション(どのように歌われるべきか)

実際のヘブライ文字は、簡略版に示されているものです(つまり、ここで要求されているものの最終結果)。ここで「アクセント」と呼んでいるものは、発音区別符号として知られています。ヘブライ語の発音区別符号に関するウィキペディアの記事には、次の画像とキャプションを含むこれらのマークに関する多くの良い情報があります。

創世記1:9神は「水を集めよう」と言われた
創世記1:9神は「水を集めよう」と言われた。黒の文字、赤を指して、青のカンチレーション

これらの基本文字から最初の行(母音など)が示すものに到達するには、1つ以上の「アクセント」を追加する必要があります。Unicode(SQL ServerのUTF-16、ただしデフォルトの解釈はUCS-2 / Basic Multilingual Plane(BMP)コードポイントのみを処理します)では、一部の文字が隣接する場合に別の非オーバーレイ文字をオーバーレイできます。これらは結合文字として知られています。

意味:

SELECT DATALENGTH(N'מַ֖'); -- character taken from original given text

戻り値:

6

2ほとんどの人が単一の2バイト文字を見ることを期待するほどではありません。したがって、次のようにして、どのキャラクターが存在するかを見つけようとします。

SELECT UNICODE(N'מַ֖');

返されるもの:

1502

もちろん、UNICODEおよびASCII関数INTは、指定された文字列の最初の文字の値のみを返します。ただし、1502の値は2バイトのみをカバーするため、4バイトは考慮されません。同じヘブライ語の「文字」のバイナリ/ 16進値を見ると:

SELECT NCHAR(1502), CONVERT(BINARY(2), UNICODE(N'מַ֖')), CONVERT(VARBINARY(10), N'מַ֖');

我々が得る:

מ
0x05DE  0xDE05B7059605

現在、0x05DEは1502の16進表記であり、1502は " מ " のみです。次の部分は、3つの2バイトセットDE05 B705 9605に分割できます。現在、Unicode文字列値はリトルエンディアンに格納されています。つまり、バイト順が逆になっています。これら3つのセットをそれぞれ切り替えると、次のようになります。

05DE(基本文字)05B7 0596(4バイトのアカウントなし)。

OK。そのベースキャラクターを削除するとどうなりますか?

SELECT REPLACE(N'מַ֖' COLLATE Hebrew_BIN2, NCHAR(1502) COLLATE Hebrew_BIN2, '');

これにより、残りの2文字が返されます(ここではわかりにくいため、フォントサイズを増やすために次の行をヘッダーにしました。上記REPLACEを実行して確認することもできます)。

theからמを削除すると、下部に2つの文字が残ります。

したがって、これらの「余分な」結合文字(http://unicode-table.com/en/search/?q=hebrewにあります)の1つである個々のコードポイントを削除する必要があります。基本文字で。次の方法でできます。

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の間でコード・ポイントのセットがあり、いくつかの母音と発音は、文字に組み込まれた「アクセント」。それらを処理する必要がある場合は、それらの文字の単純な置換を行う関数の2番目のステップになります。

  • これらのアクセント、句読点などのコードポイントは、バイナリ照合を使用する場合にのみ一致するようです。使用Hebrew_100_CS_AS_KS_WS_SCしてもそれらと一致しませんでした。:しかし、次のように仕事をしたHebrew_BINHebrew_BIN2Latin1_General_BIN、とLatin1_General_BIN2。関数では、最終的にを使用しましたHebrew_BIN2。バイナリ照合順序を使用する場合、古い_BIN照合順序を使用する特別な必要がない限り、新しい_BIN2照合順序のみを使用する必要があることに注意してください。

  • 好奇心is盛な人にとっては、ヘブライ語のサンプルテキストは実際にはBereishis 1:1です(これはヘブライ語が右から左に読まれているため、右側の最初の単語でもあります。英語では "Genesis 1:1"です)それは単語の直接翻訳ではなく、トーラー/聖書の最初の本の名前です;直接翻訳は「初めに」です):

    神が天と地を創造し始めたとき

  • 2015-01-19:結合文字とヘブライ文字セットの両方を説明する素晴らしいリソースを見つけました:


@Kinありがとう!(再び:)。さんがあなたのコメントは;-D今回の存続時間の長さを見てみましょう(私たちのゴーストのクリーンアップ「プロセス」にメモ:任意の失礼を持っている意味や意義を悪意に満ちた、そしてハローでこのスマイリーは😇は、この笑顔猫を😺ないことが証明されていなかったこと)
ソロモンラッツキー

1
そして再びあなたの答えから予期しないことを学びます。いいね!
マックスヴァーノン

1
うわー!エンコーディングの処理に関する優れた説明とともに、素晴らしい言語学の答えがスローされます!ありがとう、ソロモン!
マイクウィリアムソン

1

これはおもしろい問題であり、私はしばらく前から日本のキャラクターを扱っていました。私はあなたの問題のキャラクターを見つけようとして少しレンガの壁にぶつかりましたが、これであなたがそれらを見つけることでどこかに行くことを願っています。

まず、すべてのNCHARをテーブルに入れました。

SET NOCOUNT ON  

DECLARE @cnt INT = 1
DECLARE @sqlcmd NVARCHAR(512) = ''

CREATE TABLE #CHARS (
[CharOrder] INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
[Result] NVARCHAR(4) 
)

WHILE @cnt < 65536
BEGIN

SELECT @sqlcmd = '
INSERT #CHARS
    ([Result] )
SELECT NCHAR(' + CAST(@cnt AS NVARCHAR) + ')
'

EXEC sys.sp_executesql @sqlcmd

SET @cnt +=1 
END

次に、アクセント記号のない文字の1つを見つけました。

SELECT  c.CharOrder, c.Result
FROM    #CHARS AS c
WHERE c.Result = N'ר'
ORDER BY c.CharOrder

次に、ヘブライ語の文字が含まれる文字の範囲を見つけました。

SELECT  c.CharOrder, c.Result
FROM    #CHARS AS c
WHERE c.CharOrder >= 1488
AND c.CharOrder < 1523
ORDER BY c.CharOrder

しかし、必要なアクセント付き文字を見つけようとしても、コード8501で1回ヒットする場合を除き、表示されないようです。

SELECT  c.CharOrder ,
        c.Result
FROM    #CHARS AS c
WHERE   c.Result IN ( N'רֵ', N'א', N'שִׁ֖', N'י', N'ת', N'בְּ', N'בָּ', N'רָ֣',
                      N'א', N'אֱ', N'לֹ', N'הִ֑', N'י', N'ם', N'אֵ֥', N'ת',
                      N'הַ', N'שָּׁ', N'מַ֖', N'יִ', N'ם', N'וְ', N'אֵ֥', N'ת',
                      N'הָ', N'אָֽ', N'רֶ', N'ץ' )
ORDER BY c.CharOrder

したがって、周囲の文字を見るだけでは、テキストに一致する他の文字を実際に特定することはできません。

SELECT  c.CharOrder, c.Result
FROM    #CHARS AS c
WHERE c.CharOrder >= 8499
AND c.CharOrder < 8539
ORDER BY c.CharOrder

それらの多くは、それらの漠然とした小さな長方形として投げられるようです。

繰り返しますが、申し訳ありませんが、それは解決策ではありませんが、それが役立つことを願っています。


1
re:「必要なアクセント文字を見つけようとしても、表示されないようです」というのは、それらが存在しないためです;-)。私の答えで詳しく説明しますが、基本的には、ベースキャラクターと同じ目に見える位置を占める1つまたは2つのオーバーレイキャラクターを持つベースキャラクターです。
ソロモンラツキー14

3
かっこいい。それらのマークがキャラクターとは別のものだとは思っていなかったでしょう。ありがとう。
エリックダーリン14

1

Numbersテーブルを使用しました。これが何であるか、なぜ役立つのか、どのように効率的に取得するのかを説明する投稿がいくつもあります。

組み込み機能を使用して、アクセント付き文字をアクセントなしの文字に変換しません。代わりに、必要な変換を入力するルックアップリストを作成します。もちろんnvarchar、翻訳を使用して定義する必要がありますN'x'

行連結のヒントを提供してくれたこの投稿に感謝します。

drop table #Numbers;

select
    *
into #Numbers
from 
    (
    select *
    from (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11)) as T(N)
    ) as xx;

drop table #Lookups;

select
    *
into #Lookups
from 
    (
    select *
    from (values ('a','m'),('b','n'),('c','o'),('d','p'),('e','q'),('m','z')) as T(CharFrom,CharTo)
    ) as xx;


drop table #Inputs;

select
    *
into #Inputs
from 
    (
    select *
    from (values ('abcdefghi')
                ,('abtcd')
        ) as T(Word)
    ) as xx;


select
     ix.Word as Original
    ,(
    select
        Coalesce(l.CharTo, SUBSTRING(i.word, n.N, 1)) -- do not alias
    from #Inputs as i
    cross apply #Numbers as n
    left join #Lookups as l
        on l.CharFrom = SUBSTRING(i.word, n.N, 1)
    where n.N <= LEN(i.Word)
    and i.Word = ix.Word
    for xml path ('')
    ) as Substituted
from #Inputs as ix;

マイケル、ヘブライ語は実際にはそのようには機能しません。これらは、以下と同じように真の「アクセント文字」ではありませんÜ ö ò ô å Ä Å É ï。したがって、標準の翻訳/マッピング方法は機能しません。
ソロモンラッツキー14

0

将来のだれかが望めばうまくいくものがここにあります。

function accentHebrewToCleanHebrew($accentHebrew){ //Strip Extras $search = array("&#1425;", "&#1426;", "&#1427;", "&#1428;", "&#1429;", "&#1430;", "&#1431;", "&#1432;", "&#1433;", "&#1434;", "&#1435;", "&#1436;", "&#1437;", "&#1438;", "&#1439;", "&#1440;", "&#1441;", "&#1442;", "&#1443;", "&#1444;", "&#1445;", "&#1446;", "&#1447;", "&#1448;", "&#1449;", "&#1450;", "&#1451;", "&#1452;", "&#1453;", "&#1454;", "&#1455;", "&#1456;", "&#1457;", "&#1458;", "&#1459;", "&#1460;", "&#1461;", "&#1462;", "&#1463;", "&#1464;", "&#1465;", "&#1466;", "&#1467;", "&#1468;", "&#1469;", "&#1470;", "&#1471;", "&#1472;", "&#1473;", "&#1474;", "&#1475;", "&#1476;", "&#1477;", "&#1478;", "&#1479;"); $replace = ""; $cleanHebrew = str_replace($search, $replace, $accentHebrew); return $cleanHebrew; }

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.