Làm thế nào để tước dấu tiếng Do Thái


Câu trả lời:


26

Mẹo ở đây là nhận ra rằng những ký tự mà bạn nhìn thấy trong câu hỏi có "dấu" không thực sự ký tự (nghĩa là "Đây không phải làdroidscác ký tự bạn đang tìm kiếm ";-))." Dấu "là các loại ký hiệu khác nhau biểu thị những thứ như:

  • nguyên âm (dòng và dấu chấm thường nằm dưới các chữ cái):

    chữ cái cơ sở "" = "h"; "הֶ" = "heh" và "" = "hah"

  • phát âm (dấu chấm thường bên trong hoặc bên trên chữ cái):

    "בּ" = "b" so với "ב" = "v" hoặc "שׂ" = "s" so với "שׁ" = "sh"

  • chấm câu

  • cantillation (nên hát như thế nào)

Các chữ cái tiếng Do Thái thực tế là những gì được hiển thị trong phiên bản rút gọn (tức là kết quả cuối cùng của những gì đang được yêu cầu ở đây). Những gì chúng ta đang đề cập ở đây là "dấu" được gọi là dấu phụ. Bài viết Wikipedia về diacritics tiếng Do Thái có nhiều thông tin tốt về các nhãn hiệu này, bao gồm hình ảnh và chú thích sau:

Sáng thế Ký 1: 9 Và Thiên Chúa nói: "Hãy để nước được thu thập"
Sáng thế Ký 1: 9 Và Đức Chúa Trời phán: "Hãy để nước được thu thập". Chữ màu đen, chỉ màu đỏ, màu xanh lá cây

Bắt đầu từ những ký tự cơ bản đó đến những gì dòng đầu tiên (với nguyên âm, v.v.) hiển thị là vấn đề thêm một hoặc nhiều "dấu". Unicode (UTF-16 trong SQL Server, mặc dù giải thích mặc định chỉ xử lý các điểm mã UCS-2 / Basic đa ngôn ngữ cơ bản (BMP)) cho phép một số ký tự phủ lên một ký tự không lớp phủ khác khi liền kề với chúng. Chúng được gọi là Nhân vật kết hợp .

Ý nghĩa:

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

Trả về:

6

không 2như hầu hết mọi người mong đợi khi nhìn thấy một ký tự hai byte đơn. Vì vậy, có lẽ chúng tôi cố gắng tìm những gì nhân vật ở đó bằng cách làm:

SELECT UNICODE(N'מַ֖');

Trả về:

1502

Tất nhiên, các hàm UNICODEASCIIchỉ trả về INTgiá trị của ký tự đầu tiên của bất kỳ chuỗi nào chúng được đưa ra. Nhưng giá trị 1502 chỉ bao gồm 2 byte, không để lại 4 byte. Nhìn vào các giá trị nhị phân / hex của cùng một "ký tự" tiếng Do Thái:

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

chúng tôi nhận được:

מ
0x05DE  0xDE05B7059605

Bây giờ, 0x05DE là đại diện hex của 1502, và 1502 chỉ "là מ ". Phần tiếp theo có thể được tách thành ba bộ 2 byte: DE05 B705 9605 . Bây giờ, các giá trị chuỗi Unicode được lưu trữ trong Little Endian, có nghĩa là thứ tự byte bị đảo ngược. Nếu chúng ta chuyển đổi từng bộ trong ba bộ đó, chúng ta sẽ nhận được:

05DE (ký tự cơ sở) 05B7 0596 (không được tính cho 4 byte).

Đồng ý. Vậy điều gì sẽ xảy ra nếu chúng ta loại bỏ nhân vật cơ sở đó?

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

Điều đó trả về hai ký tự còn lại (không dễ thấy ở đây vì vậy tôi đã đặt dòng sau thành tiêu đề để tăng kích thước phông chữ; bạn cũng có thể chạy ở trên REPLACEđể xem chúng):

Xóa khỏi để lại hai ký tự ở dưới cùng:

Do đó, chúng ta cần loại bỏ từng điểm mã riêng lẻ là một trong những ký tự kết hợp "phụ" này (được tìm thấy tại: http://unicode-table.com/en/search/?q=hebrew ) và điều đó sẽ khiến chúng ta rời bỏ với các ký tự cơ sở. Chúng tôi có thể làm điều đó thông qua:

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;

Và sau đó chúng ta có thể kiểm tra nó với văn bản gốc như sau:

DECLARE @Hebrew NVARCHAR(200) = N'בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ';

SELECT dbo.RemoveHebrewAccents(@Hebrew);

Trả về:

בב


Ghi chú bổ sung:

  • Về mặt kỹ thuật, có một tập hợp các điểm mã giữa 64298 và 64334 có một số nguyên âm và "dấu" phát âm được tích hợp trong ký tự. Nếu cần xử lý, đó có thể là bước thứ hai trong hàm để thực hiện thay thế đơn giản các ký tự đó.

  • Dường như các điểm nhấn, dấu chấm câu, v.v ... chỉ khớp với nhau khi sử dụng đối chiếu nhị phân. Ngay cả việc sử dụng Hebrew_100_CS_AS_KS_WS_SCkhông phù hợp với họ. Nhưng sau làm việc: Hebrew_BIN, Hebrew_BIN2, Latin1_General_BIN, và Latin1_General_BIN2. Trong chức năng tôi đã kết thúc bằng cách sử dụng Hebrew_BIN2. Xin lưu ý rằng khi sử dụng các đối chiếu nhị phân, trừ khi bạn có nhu cầu cụ thể để sử dụng các _BINđối chiếu cũ hơn , bạn chỉ nên sử dụng các _BIN2đối chiếu mới hơn .

  • Đối với bất kỳ ai tò mò, văn bản mẫu tiếng Hê-bơ-rơ thực sự là Bereishis 1: 1 (đó cũng là từ đầu tiên ở phía bên phải vì tiếng Do Thái được đọc từ phải sang trái; trong tiếng Anh, nó sẽ là "Genesis 1: 1" đó không phải là bản dịch trực tiếp của từ này, chỉ là tên của cuốn sách đầu tiên của Torah / Kinh thánh, bản dịch trực tiếp là "ở đầu"):

    Vào đầu Thiên Chúa tạo ra thiên đàng và Trái đất

  • 2015-01-19: Tôi tìm thấy một số tài nguyên tuyệt vời giải thích cả bộ Nhân vật Kết hợp và bộ ký tự tiếng Do Thái:


@Kin Cảm ơn! (lần nữa :). Chúng ta hãy xem bình luận của bạn tồn tại được bao lâu trong thời gian này ;-D (lưu ý đến "quy trình" dọn dẹp ma của chúng tôi: điều đó không có nghĩa là có bất kỳ hàm ý thô lỗ hay ngáy nào, và nụ cười với quầng sáng này chứng minh rằng cũng như con mèo đang cười này)
Solomon Rutzky 2/12/2015

1
và một lần nữa tôi học được điều gì đó bất ngờ từ câu trả lời của bạn. Đẹp!
Max Vernon

1
Ồ Một câu trả lời ngôn ngữ tốt đẹp được đưa vào với một mô tả tuyệt vời về xử lý mã hóa! Cảm ơn, Solomon!
Mike Williamson

1

Đây là một vấn đề thú vị, và tôi đã phải đối mặt một lúc khi làm việc với các nhân vật Nhật Bản. Tôi va vào một bức tường gạch cố gắng xác định vị trí các nhân vật có vấn đề của bạn, mặc dù tôi hy vọng điều này sẽ đưa bạn đi đâu đó với việc tìm thấy chúng.

Đầu tiên tôi nhận tất cả NCHAR vào một bảng:

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

Sau đó, tôi tìm thấy một trong những ký tự không dấu:

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

Sau đó, tôi định vị phạm vi ký tự mà các ký tự tiếng Do Thái nằm trong:

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

Nhưng cố gắng tìm các ký tự có dấu mà bạn muốn, chúng dường như không hiển thị, ngoại trừ một lần nhấn ở mã 8501.

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

Vì vậy, chỉ cần nhìn vào các nhân vật xung quanh, tôi thực sự không thể xác định bất kỳ trận đấu nào khác với văn bản của bạn.

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

Rất nhiều trong số chúng dường như bị ném như những hình chữ nhật nhỏ bé mơ hồ của bất cứ điều gì.

Một lần nữa, xin lỗi nó không phải là một giải pháp, nhưng hy vọng nó sẽ giúp.


1
re: "cố gắng tìm các ký tự có dấu mà bạn muốn, dường như chúng không xuất hiện", đó là vì chúng không tồn tại ;-). Tôi giải thích chi tiết hơn trong câu trả lời của mình, nhưng về cơ bản, đó là một nhân vật cơ sở với một hoặc hai ký tự lớp phủ chiếm vị trí hiển thị giống như ký tự cơ sở.
Solomon Rutzky

3
Điều đó thật tuyệt. Tôi không bao giờ có thể nghĩ rằng những dấu ấn đó là tách biệt với các nhân vật. Cảm ơn.
Erik Darling

1

Tôi đã sử dụng bảng Số. Có bất kỳ số lượng bài viết giải thích điều này là gì, tại sao nó hữu ích và làm thế nào để có được một bài viết hiệu quả.

Tôi không sử dụng bất kỳ chức năng tích hợp nào để chuyển đổi các ký tự có dấu thành tương đương không có dấu. Thay vào đó, tôi xây dựng một danh sách tra cứu mà bạn sẽ điền vào các chuyển đổi bạn yêu cầu. Tất nhiên, bạn sẽ phải sử dụng nvarcharvà xác định bản dịch N'x'của mình.

Nhờ bài đăng này cho mẹo nối hàng.

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;

Michael, tiếng Do Thái không thực sự hoạt động theo cách đó. Đây không thực sự là "nhân vật có dấu" theo cùng một cách như sau : Ü ö ò ô å Ä Å É ï. Do đó, một phương pháp dịch thuật / ánh xạ chuẩn sẽ không hoạt động.
Solomon Rutzky

0

Đây là những gì làm việc nếu bất cứ ai trong tương lai muốn.

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; }

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.