উত্তর:
কৌতুক এখানে উপলব্ধি করা যে, এই অক্ষর আছে যা আপনি "কথা" দিয়ে প্রশ্ন মধ্যে দেখতে সত্যিই না হয় অক্ষর (যেমন "এই নয়Droidsযে অক্ষরগুলি আপনি অনুসন্ধান করছেন ";-))" "উচ্চারণ" হ'ল বিভিন্ন ধরণের স্বরলিপিগুলি যেমন:
স্বর (লাইন এবং বিন্দু যা সাধারণত অক্ষরের অধীনে থাকে):
উচ্চারণ (বিন্দুগুলি যা সাধারণত অক্ষরের অভ্যন্তরে বা উপরে থাকে):
যতিচিহ্নসিন্নিবেশ
প্রকৃত হিব্রু অক্ষরগুলি হ'ল স্ট্রিপড ডাউন সংস্করণে (যেমন এখানে অনুরোধ করা হচ্ছে তার শেষ ফলাফল)। আমরা এখানে "অ্যাকসেন্ট" হিসাবে উল্লেখ করছি যা ডায়াক্রিটিকাল চিহ্ন হিসাবে পরিচিত। হিব্রু ডায়রিটিক্স সম্পর্কিত উইকিপিডিয়া নিবন্ধে এই চিত্রগুলি সম্পর্কে নীচের চিত্র এবং ক্যাপশন সহ অনেকগুলি ভাল তথ্য রয়েছে:
জেনারেল 1: 9 এবং saidশ্বর বলেছিলেন, "জল জড়ো হোক"। কালো বর্ণের বর্ণগুলি, লাল রঙে ইঙ্গিত করছে, নীল রঙে ক্যান্টিলেশন
এই বেস অক্ষরগুলি থেকে প্রথম লাইনটি (স্বর ইত্যাদির সাহায্যে) কী দেখায় তা এক বা একাধিক "উচ্চারণ" যুক্ত করার বিষয়। ইউনিকোড (এসকিউএল সার্ভারে ইউটিএফ -16, যদিও ডিফল্ট ব্যাখ্যা কেবলমাত্র ইউসিএস -2 / বেসিক বহুভাষিক প্লেন (বিএমপি) কোড পয়েন্টগুলি পরিচালনা করে কিছু সংক্ষিপ্ত অক্ষরগুলি যখন তাদের সংলগ্ন হয় তখন একটি অন্য অ-ওভারলে চরিত্রকে ওভারলে করার অনুমতি দেয়। এগুলি সম্মিলিত অক্ষর হিসাবে পরিচিত ।
অর্থ:
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" হবে যদিও এটি শব্দের সরাসরি অনুবাদ নয়, কেবল তাওরাত / বাইবেলের প্রথম বইয়ের নাম; সরাসরি অনুবাদটি "শুরুতে"):
God'sশ্বরের আকাশ ও পৃথিবী সৃষ্টির শুরুতে
2015-01-19: আমি কিছু দুর্দান্ত সংস্থান পেয়েছি যা সম্মিলন অক্ষর এবং হিব্রু চরিত্র সেট উভয়ের ব্যাখ্যা করে:
এটি একটি আকর্ষণীয় সমস্যা এবং আমি প্রথম ধরণের জাপানি চরিত্রগুলির সাথে কাজ করার কিছুক্ষণ আগে মুখোমুখি হয়েছি। আমি আপনার সমস্যার চরিত্রগুলি সনাক্ত করার চেষ্টা করে একটি ইটের প্রাচীরের একটি অংশটি আঘাত করেছি, যদিও আমি আশা করি এটি আপনাকে খুঁজে পেয়ে কোথাও যেতে পারে।
প্রথমে আমি সমস্ত এনসিএইচআর একটি টেবিলে পেয়েছি:
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;
}