मुझे उम्मीद नहीं है कि टेक्स्ट को यूसीएस -2 के रूप में देखते हुए कई समस्याएं पैदा होंगी।
केस रूपांतरण कोई समस्या नहीं होनी चाहिए, क्योंकि (AFAIK) बीएमपी के ऊपर कोई मामला मैपिंग नहीं है (पहचान मैपिंग को छोड़कर, निश्चित रूप से!), और जाहिर है, सरोगेट वर्ण खुद को मानचित्रण करने जा रहे हैं।
हर दूसरे चरित्र को झुकाव सिर्फ परेशानी के लिए पूछ रहा है। हकीकत में, चरित्र मूल्यों के विचार के बिना इन प्रकार के परिवर्तनों को करना हमेशा एक खतरनाक गतिविधि है। मैं इसे स्ट्रिंग ट्रंकेशन के साथ वैध रूप से हो रहा देख सकता हूं। लेकिन यदि परिणाम में कोई बेजोड़ सरोगेट दिखाई देता है, तो यह विशाल समस्या नहीं है। कोई भी सिस्टम जो इस तरह के डेटा प्राप्त करता है और परवाह करता है-शायद बेमिसाल सरोगेट को एक प्रतिस्थापन चरित्र के साथ प्रतिस्थापित करेगा, अगर यह इसके बारे में कुछ भी करने के लिए परेशान है।
जाहिर है, स्ट्रिंग लम्बाई संख्याओं की बजाय बाइट्स/2 होने जा रही है, लेकिन यूनिकोड कोड चार्ट की गहराई को प्लंबिंग शुरू करने के बाद संख्या-वर्ण-वर्ण एक बहुत उपयोगी मूल्य नहीं है। उदाहरण के लिए, वर्णों, आरटीएल भाषाओं, दिशात्मक नियंत्रण वर्णों, टैग, और कई प्रकार के अंतरिक्ष वर्णों को संयोजित करने के कारण, आप ASCII रेंज छोड़ने के बाद मोनोस्पेस्ड डिस्प्ले में अच्छे नतीजे नहीं प्राप्त करेंगे। उच्च कोड बिंदु आपकी समस्याओं का कम से कम होने जा रहे हैं।
बस सुरक्षित पक्ष पर रहने के लिए, आपको संभवतः पुरातत्वविदों के नामों की तुलना में अपने क्यूनिफॉर्म ग्रंथों को एक अलग कॉलम में स्टोर करना चाहिए। : डी
अब अनुभवजन्य डेटा के साथ अद्यतन करें!
मैंने अभी यह देखने के लिए एक परीक्षण चलाया कि केस ट्रांसफॉर्मेशन के साथ क्या होता है। मैंने लैटिन स्क्रिप्ट में दो बार अपरकेस में अंग्रेजी शब्द टेस्ट के साथ एक स्ट्रिंग बनाई, फिर डीज़्रेट स्क्रिप्ट में। मैंने .NET और SQL सर्वर में इस स्ट्रिंग में निम्न-केस परिवर्तन लागू किया।
.NET संस्करण दोनों स्क्रिप्ट में सभी अक्षरों को सही ढंग से कम कर देता है। SQL सर्वर संस्करण ने केवल लैटिन वर्णों को कम किया और डीज़्रेट वर्णों को अपरिवर्तित छोड़ दिया। यह यूटीएफ -16 छंद यूसीएस -2 के संचालन के संबंध में उम्मीदों के साथ मिलता है।
using System;
using System.Data.SqlClient;
class Program
{
static void Main(string[] args)
{
string myDeseretText = "TEST\U00010413\U00010407\U0001041D\U00010413";
string dotNetLower = myDeseretText.ToLower();
string dbLower = LowercaseInDb(myDeseretText);
Console.WriteLine(" Original: {0}", DisplayUtf16CodeUnits(myDeseretText));
Console.WriteLine(".NET Lower: {0}", DisplayUtf16CodeUnits(dotNetLower));
Console.WriteLine(" DB Lower: {0}", DisplayUtf16CodeUnits(dbLower));
Console.ReadLine();
}
private static string LowercaseInDb(string value)
{
SqlConnectionStringBuilder connection = new SqlConnectionStringBuilder();
connection.DataSource = "(local)";
connection.IntegratedSecurity = true;
using (SqlConnection conn = new SqlConnection(connection.ToString()))
{
conn.Open();
string commandText = "SELECT LOWER(@myString) as LoweredString";
using (SqlCommand comm = new SqlCommand(commandText, conn))
{
comm.CommandType = System.Data.CommandType.Text;
comm.Parameters.Add("@myString", System.Data.SqlDbType.NVarChar, 100);
comm.Parameters["@myString"].Value = value;
using (SqlDataReader reader = comm.ExecuteReader())
{
reader.Read();
return (string)reader["LoweredString"];
}
}
}
}
private static string DisplayUtf16CodeUnits(string value)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (char c in value)
sb.AppendFormat("{0:X4} ", (int)c);
return sb.ToString();
}
}
आउटपुट:
Original: 0054 0045 0053 0054 D801 DC13 D801 DC07 D801 DC1D D801 DC13
.NET Lower: 0074 0065 0073 0074 D801 DC3B D801 DC2F D801 DC45 D801 DC3B
DB Lower: 0074 0065 0073 0074 D801 DC13 D801 DC07 D801 DC1D D801 DC13
मामले किसी को भी एक डीज़रेट फ़ॉन्ट स्थापित किया है बस में, यहाँ अपने आनंद के लिए वास्तविक तार कर रहे हैं:
Original: TEST
.NET Lower: test
DB Lower: test
ठीक है, तो पढ़ने/स्ट्रिंग के रूप में लिख एक nvarchar क्षेत्र के लिए एक पूरी इकाई समस्या या नुकसान की जानकारी का कारण नहीं होगा, भले ही इसमें सरोगेट जोड़े के रूप में क्या व्याख्या की जाएगी। अब, एक सी कॉलम को सी # स्ट्रिंग लिखने के बारे में क्या? मुझे संदेह है कि कुछ व्याख्या और रूपांतरण शामिल होगा और डेटा हानि का कारण बन जाएगा ... – Triynko
एकल-बाइट कॉलम में उन पर परिभाषित एक गैर-यूनिकोड संयोजन अनुक्रम है, जो न केवल नियमों को खोजना और क्रमबद्ध करना परिभाषित करता है, बल्कि कोड पृष्ठ जो परिभाषित करता है पात्रों की अनुमति है। कॉलम के कोड पेज में किसी मान पर मैप किए गए किसी यूनिकोड कोड पॉइंट को संरक्षित किया जाएगा, और शेष को त्याग दिया जाएगा। –
त्याग दिया ... या एक विशेष डमी या "गैर चरित्र" बाइट के साथ प्रतिस्थापित किया? एकल-बाइट कोड पेज गैर-वर्णों के लिए एक निश्चित बाइट आरक्षित करते हैं? मैंने कुछ उदाहरण दिखाए हैं कि लक्ष्य कोड स्थान में परिभाषित यूनिकोड वर्णों को प्रश्न चिह्न के साथ प्रतिस्थापित किया गया है, लेकिन शायद यह कि कैसे गैर-वर्ण प्रदर्शित होते हैं? – Triynko