जवाबों:
यहाँ ट्रिक यह महसूस करना है कि इन अक्षरों को जो आप "एक्सेंट" के साथ प्रश्न में देखते हैं, वास्तव में अक्षर नहीं हैं (यानी "ये नहीं हैं")ड्रौयडवर्ण जो आप ";-)) की तलाश में हैं।" लहजे "विभिन्न प्रकार के नोटेशन हैं जो चीजों को इंगित करते हैं:
स्वर (रेखाएँ और बिंदु जो आमतौर पर अक्षरों के नीचे होते हैं):
उच्चारण (डॉट्स जो आमतौर पर अक्षरों के अंदर या ऊपर होते हैं):
विराम चिह्न
वास्तविक हिब्रू अक्षर वही हैं जो स्ट्राइप्ड डाउन वर्जन में दिखाए गए हैं (यानी जो रिक्वेस्ट यहां मांगी जा रही है)। जिसे हम यहां "उच्चारण" के रूप में संदर्भित कर रहे हैं, उसे विशेषांक के रूप में जाना जाता है। हिब्रू विकिपीडिया पर विकिपीडिया लेख में इन चिह्नों के बारे में बहुत अच्छी जानकारी है, जिसमें निम्न छवि और कैप्शन शामिल हैं:
जनरल 1: 9 और भगवान ने कहा, "पानी इकट्ठा हो"। काले रंग में अक्षर, लाल रंग में इंगित, नीले रंग में रंगा हुआ
उन आधार वर्णों से प्राप्त करना जो पहली पंक्ति (स्वर, आदि के साथ) दिखाता है, एक या अधिक "उच्चारण" जोड़ने की बात है। SQL सर्वर में यूनिकोड (UTF-16, हालाँकि डिफ़ॉल्ट व्याख्या केवल UCS-2 / Basic बहुभाषी प्लेन (BMP) कोड पॉइंट्स को संभालती है) कुछ वर्णों को उनके समीप होने पर किसी अन्य गैर-ओवरले वर्ण को ओवरले करने की अनुमति देता है। इन्हें कॉम्बिंग कैरेक्टर के रूप में जाना जाता है ।
अर्थ:
SELECT DATALENGTH(N'מַ֖'); -- character taken from original given text
यह दिखाता है:
6
नहीं 2
ज्यादातर लोगों के लिए एक एकल, डबल-बाइट वर्ण देखने से उम्मीद करेंगे के रूप में। तो शायद हम यह जानने की कोशिश करें कि ऐसा करने से क्या चरित्र होता है:
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 । अब, यूनिकोड स्ट्रिंग मान लिटिल एंडियन में संग्रहीत हैं, जिसका अर्थ है कि बाइट-ऑर्डर उलटा है। यदि हम उन तीन सेटों में से प्रत्येक को बदलते हैं जो हमें प्राप्त होते हैं:
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 के बीच कोड-बिंदुओं का एक सेट है जो चरित्र में निर्मित कुछ स्वर और उच्चारण "उच्चारण" है। यदि उन लोगों को संभालने की आवश्यकता है, तो उन पात्रों का एक सरल प्रतिस्थापन करने के लिए फ़ंक्शन का दूसरा चरण हो सकता है।
ऐसा लगता है कि ये उच्चारण, विराम चिह्न आदि कोड-पॉइंट केवल एक द्विआधारी टकराव का उपयोग करते समय मेल खाते हैं। यहां तक कि उपयोग करना Hebrew_100_CS_AS_KS_WS_SC
भी उनसे मेल नहीं खाता था। लेकिन निम्नलिखित काम किया है: Hebrew_BIN
, Hebrew_BIN2
, Latin1_General_BIN
, और Latin1_General_BIN2
। फ़ंक्शन में मैंने उपयोग करना समाप्त कर दिया Hebrew_BIN2
। कृपया ध्यान दें कि जब बाइनरी कॉलेशन का उपयोग किया जाता है, जब तक कि आपको पुराने _BIN
कॉलेशन का उपयोग करने की कोई विशिष्ट आवश्यकता नहीं होती है , तो आपको केवल नए _BIN2
कॉलेशन का उपयोग करना चाहिए ।
जो कोई जिज्ञासु है, उसके लिए हिब्रू नमूना पाठ वास्तव में बेरीशिस 1: 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
तब मैं गैर-उच्चारण वर्णों में से एक स्थित करता हूं:
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 पर एक हिट को छोड़कर, दिखाई नहीं देते हैं।
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
उनमें से बहुत से जो कुछ भी उन छोटी छोटी आयतों के रूप में फेंक दिया लगता है।
फिर, क्षमा करें, यह कोई समाधान नहीं है, लेकिन आशा है कि यह मदद करता है।
मैंने एक संख्या तालिका का उपयोग किया है। किसी भी संख्या में यह व्याख्या करने वाले पोस्ट हैं कि यह क्या है, क्यों उपयोगी है और किसी को कुशलता से कैसे प्राप्त किया जाए।
मैं किसी भी अंतर्निहित कार्यक्षमता का उपयोग उच्चारण पात्रों को गैर-उच्चारण समकक्ष के रूप में परिवर्तित करने के लिए नहीं करता हूं। इसके बजाय मैं एक लुकअप सूची बनाता हूं, जिसे आप आवश्यक रूपांतरणों के साथ आबाद करेंगे। आपको 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;
}