Câu trả lời:
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ự là 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):
phát âm (dấu chấm thường bên trong hoặc bên trên chữ cái):
chấm câu
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à Đứ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 2
như 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 UNICODE
và ASCII
chỉ trả về INT
giá 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):
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_SC
khô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:
Đâ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.
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 nvarchar
và 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;
Ü ö ò ô å Ä Å É ï
. Do đó, một phương pháp dịch thuật / ánh xạ chuẩn sẽ không hoạt động.
Đâ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("֑", "֒", "֓", "֔", "֕",
"֖", "֗", "֘", "֙", "֚", "֛", "֜",
"֝", "֞", "֟", "֠", "֡", "֢", "֣",
"֤", "֥", "֦", "֧", "֨", "֩", "֪",
"֫", "֬", "֭", "֮", "֯", "ְ", "ֱ",
"ֲ", "ֳ", "ִ", "ֵ", "ֶ", "ַ", "ָ",
"ֹ", "ֺ", "ֻ", "ּ", "ֽ", "־", "ֿ",
"׀", "ׁ", "ׂ", "׃", "ׄ", "ׅ", "׆", "ׇ");
$replace = "";
$cleanHebrew = str_replace($search, $replace, $accentHebrew);
return $cleanHebrew;
}