回答:
ここでのコツは、質問で「アクセント」と表示されているこれらのキャラクターが実際にはキャラクターではないことを認識することです(つまり、「これらはドロイド探している文字」;-))。「アクセント」は、次のようなものを示すさまざまなタイプの表記法です。
母音(通常、文字の下にある線と点):
発音(通常、文字の内側または上側にあるドット):
句読点
実際のヘブライ文字は、簡略版に示されているものです(つまり、ここで要求されているものの最終結果)。ここで「アクセント」と呼んでいるものは、発音区別符号として知られています。ヘブライ語の発音区別符号に関するウィキペディアの記事には、次の画像とキャプションを含むこれらのマークに関する多くの良い情報があります。
創世記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
を実行して確認することもできます)。
したがって、これらの「余分な」結合文字(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_BIN
、Hebrew_BIN2
、Latin1_General_BIN
、とLatin1_General_BIN2
。関数では、最終的にを使用しましたHebrew_BIN2
。バイナリ照合順序を使用する場合、古い_BIN
照合順序を使用する特別な必要がない限り、新しい_BIN2
照合順序のみを使用する必要があることに注意してください。
好奇心is盛な人にとっては、ヘブライ語のサンプルテキストは実際にはBereishis 1:1です(これはヘブライ語が右から左に読まれているため、右側の最初の単語でもあります。英語では "Genesis 1:1"です)それは単語の直接翻訳ではなく、トーラー/聖書の最初の本の名前です;直接翻訳は「初めに」です):
神が天と地を創造し始めたとき
2015-01-19:結合文字とヘブライ文字セットの両方を説明する素晴らしいリソースを見つけました:
これはおもしろい問題であり、私はしばらく前から日本のキャラクターを扱っていました。私はあなたの問題のキャラクターを見つけようとして少しレンガの壁にぶつかりましたが、これであなたがそれらを見つけることでどこかに行くことを願っています。
まず、すべての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
それらの多くは、それらの漠然とした小さな長方形として投げられるようです。
繰り返しますが、申し訳ありませんが、それは解決策ではありませんが、それが役立つことを願っています。
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;
Ü ö ò ô å Ä Å É ï
。したがって、標準の翻訳/マッピング方法は機能しません。
将来のだれかが望めばうまくいくものがここにあります。
function accentHebrewToCleanHebrew($accentHebrew){
//Strip Extras
$search = array("֑", "֒", "֓", "֔", "֕",
"֖", "֗", "֘", "֙", "֚", "֛", "֜",
"֝", "֞", "֟", "֠", "֡", "֢", "֣",
"֤", "֥", "֦", "֧", "֨", "֩", "֪",
"֫", "֬", "֭", "֮", "֯", "ְ", "ֱ",
"ֲ", "ֳ", "ִ", "ֵ", "ֶ", "ַ", "ָ",
"ֹ", "ֺ", "ֻ", "ּ", "ֽ", "־", "ֿ",
"׀", "ׁ", "ׂ", "׃", "ׄ", "ׅ", "׆", "ׇ");
$replace = "";
$cleanHebrew = str_replace($search, $replace, $accentHebrew);
return $cleanHebrew;
}