मैं स्ट्रिंग को UTF-8 में C # में कैसे बदल सकता हूं?


146

मेरे पास एक स्ट्रिंग है जो मुझे तीसरे पक्ष के ऐप से मिलती है और मैं इसे अपने विंडोज सरफेस पर C # का उपयोग करके किसी भी भाषा में सही ढंग से प्रदर्शित करना चाहूंगा।

गलत एन्कोडिंग के कारण, मेरी स्ट्रिंग का एक टुकड़ा इस तरह से स्पैनिश में दिखता है:

Acción

जबकि यह इस तरह दिखना चाहिए:

Acción

इस प्रश्न पर उत्तर के अनुसार: सी # में स्ट्रिंग एन्कोडिंग कैसे पता करें , मुझे जो एन्कोडिंग प्राप्त हो रही है वह पहले से ही यूटीएफ -8 पर आनी चाहिए, लेकिन इसे एन्कोडिंग.फॉल्ट (शायद एएनएसआई?) पर पढ़ा जाता है।

मैं इस स्ट्रिंग को वास्तविक UTF-8 में बदलने की कोशिश कर रहा हूं, लेकिन समस्याओं में से एक यह है कि मैं केवल एन्कोडिंग वर्ग (UTF8 और यूनिकोड गुण) का एक सबसेट देख सकता हूं, शायद इसलिए कि मैं विंडोज़ सतह एपीआई तक सीमित हूं।

मैंने कुछ स्निपेट की कोशिश की है जो मैंने इंटरनेट पर पाया है, लेकिन उनमें से कोई भी पूर्वी भाषाओं (यानी कोरियाई) के लिए अब तक सफल साबित नहीं हुआ है। एक उदाहरण इस प्रकार है:

var utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(myString);
myString= utf8.GetString(utfBytes, 0, utfBytes.Length);     

मैंने स्ट्रिंग को बाइट सरणी में निकालने की कोशिश की और फिर UTF8.GetString का उपयोग किया:

byte[] myByteArray = new byte[myString.Length];
for (int ix = 0; ix < myString.Length; ++ix)
{
    char ch = myString[ix];
    myByteArray[ix] = (byte) ch;
}

myString = Encoding.UTF8.GetString(myByteArray, 0, myString.Length);

क्या आप लोगों के पास कोई अन्य विचार है जो मैं कोशिश कर सकता हूं?


5
आपकी समस्या उस कोड से आ रही है जिसने पहली बार में (एक स्ट्रीम या बाइट [] से) स्ट्रिंग बनाया था। कृपया वह कोड दिखाएं।
SLACs 15

1
@Oded: .Net स्ट्रिंग को UTF16 के रूप में मेमोरी में संग्रहीत किया जाता है, लेकिन Encoding.Defaultसिस्टम के ANSI कोडपेज को लौटाता है।
SLaks

यहाँ एक स्ट्रिंग का उदाहरण दिया गया है जो अंग्रेजी भाषा पर काम नहीं करता है: दिन का प्रदर्शन करने के बजाय, मेरा फ्रंट एंड ऐप प्रदर्शित हो रहा है: dayâ € ™ s
Gaara

जवाबों:


251

जैसा कि आप जानते हैं कि स्ट्रिंग आ रही है जैसा कि Encoding.Defaultआप बस उपयोग कर सकते हैं:

byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);

एक और बात जो आपको याद रखनी पड़ सकती है: यदि आप कुछ तारों को आउटपुट करने के लिए Console.WriteLine का उपयोग कर रहे हैं, तो आपको भी लिखना चाहिए Console.OutputEncoding = System.Text.Encoding.UTF8;!!! या सभी utf8 स्ट्रिंग्स को gbk के रूप में आउटपुट किया जाएगा ...


यह भी काम करता है यह वास्तव में मेरे उत्तर की तुलना में बहुत अच्छा है जो भी काम करता है मैं आपको एक अच्छा काम दे रहा हूं
मेथोडमैन

धन्यवाद! समस्या यह है कि, जैसा कि मैंने वर्णन में उल्लेख किया है, सतह के लिए एपीआई अधूरा है (मेरे लिए उपलब्ध कोई एनकोडिंग।डिफॉल्ट)।
गारा

3
@ गारा: कोशिश करो Encoding.GetEncoding(...); आपको वास्तविक एन्कोडिंग का नाम खोजने की आवश्यकता होगी जो गलत तरीके से दूसरे छोर पर उपयोग की गई थी।
SLAKs

1
क्या आप बता सकते हैं कि यह क्यों काम करता है? यदि डिफ़ॉल्ट GB2312 है, तो Encoding.Default.GetBytes स्ट्रिंग को बाइट सरणी में GB2312 एनकोडर का उपयोग करने के लिए एन्कोड करेगा, फिर Encoding.UTF8.GetString यूटीएफ 8 डीकोडर द्वारा बाइट सरणी को डिकोड करने का प्रयास करेगा, परिणाम गलत होना चाहिए, लेकिन यह काम क्यों करता है। @anothershrubery
guorongfei

1
@guorongfei का आधार यह है कि myStringमोजिबेक है। कोड पहले गलत डिकोडिंग को हटा देता है और फिर सही डिकोडिंग करता है। यह तब तक काम करता है जब तक कि गलत डिकोडिंग ने डेटा नहीं खोया है। लेकिन जैसा कि @SLaks ने बताया, सही एन्कोडिंग का उपयोग करना बेहतर होगा जो कि गलत था। (कोड में बेहतर नाम और टिप्पणियां यह समझने में मदद करेंगी कि वास्तव में गलत-सही कोड वास्तव में सही करने का प्रयास है।)
टॉम ब्लोडेट

17
string utf8String = "Acción";
string propEncodeString = string.Empty;

byte[] utf8_Bytes = new byte[utf8String.Length];
for (int i = 0; i < utf8String.Length; ++i)
{
   utf8_Bytes[i] = (byte)utf8String[i];
}

propEncodeString = Encoding.UTF8.GetString(utf8_Bytes, 0, utf8_Bytes.Length);

आउटपुट जैसा दिखना चाहिए

Acción

दिन का प्रदर्शन दिन का है

DecodeFromUtf8 () को कॉल करें;

private static void DecodeFromUtf8()
{
    string utf8_String = "day’s";
    byte[] bytes = Encoding.Default.GetBytes(utf8_String);
    utf8_String = Encoding.UTF8.GetString(bytes);
}

1
धन्यवाद! यह स्पेनिश में काम करता है, समस्या यह है कि वही पूर्वी भाषाओं (यानी कोरियाई) पर काम नहीं करेगा। मैं इंटरनेट पर UTF-8 रूपांतरण एल्गोरिथ्म में 8-बिट देखने की कोशिश कर रहा हूं, लेकिन फिर भी कोई भाग्य नहीं है।
गारा

यहाँ एक स्ट्रिंग का उदाहरण दिया गया है जो अंग्रेजी भाषा पर काम नहीं करता है: दिन का प्रदर्शन करने के बजाय, मेरा फ्रंट एंड ऐप प्रदर्शित हो रहा है: dayâ € ™ s
Gaara

ठीक है, मुझे इसके साथ गड़बड़ करने दें और देखें कि मैं
किसके

मैंने परीक्षण किया और यह दिन का है मैं स्थैतिक विधि को पेस्ट करूँगा जो मैंने परीक्षण किया यह वास्तव में वैसा ही है जैसा @anothershrubery ने प्रदान किया है
MethodMan

आप DecodeFromUtf8 (स्ट्रिंग utf8string) पास करके उस विधि को बदल सकते हैं;
मेथडमैन

12

आपका कोड UTF8- एन्कोडेड बाइट्स का एक क्रम पढ़ रहा है, और उन्हें 8-बिट एन्कोडिंग का उपयोग करके डिकोड करना है।

आपको उस कोड को UTF8 के रूप में बाइट्स को डिकोड करने के लिए ठीक करना होगा।

वैकल्पिक रूप से ( आदर्श नहीं ), आप खराब स्ट्रिंग को मूल बाइट सरणी में बदल सकते हैं - इसे गलत एन्कोडिंग का उपयोग करके एन्कोडिंग करके - फिर यूटीएफ 8 के रूप में बाइट्स को फिर से डिकोड करें।


धन्यवाद! समस्या यह है कि तीसरे पक्ष का ऐप C ++ है, जबकि मेरा कोड C # है, इसलिए मुझे लगता है कि उन दोनों के बीच "पुल" में डिकोडिंग होती है।
गारा


5

यदि आप mysql डेटाबेस के लिए किसी भी स्ट्रिंग को सहेजना चाहते हैं: ->

आपके डेटाबेस क्षेत्र की संरचना मैं phpmyadmin [या किसी अन्य नियंत्रण कक्ष] को utf8-gerneral-ci पर सेट करना चाहिए

2) आपको अपना स्ट्रिंग बदलना चाहिए [पूर्व। textbox1.text] बाइट के लिए, उसके बाद

2-1) बाइट को परिभाषित करें [] st2;

2-2) अपने स्ट्रिंग [textbox1.text] को यूनिकोड [mmultibyte string] में परिवर्तित करें:

byte[] st2 = System.Text.Encoding.UTF8.GetBytes(textBox1.Text);

3) किसी भी प्रश्न से पहले इस sql कमांड को निष्पादित करें:

string mysql_query2 = "SET NAMES 'utf8'";
cmd.CommandText = mysql_query2;
cmd.ExecuteNonQuery();

3-2) अब आपको इस मूल्य को उदाहरण के लिए नाम फ़ील्ड द्वारा सम्मिलित करना चाहिए:

cmd.CommandText = "INSERT INTO customer (`name`) values (@name)";

4) मुख्य कार्य जिस पर कई समाधानों ने ध्यान नहीं दिया वह नीचे की पंक्ति है: आपको नीचे दिए गए कमांड पैरामीटर में ऐड के बजाय ऐडविथवल्यू का उपयोग करना चाहिए:

cmd.Parameters.AddWithValue("@name",ut);

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ अधिक देर से अपने डेटाबेस सर्वर में वास्तविक डेटा का आनंद लें ????


3

सीएसवी फ़ाइल से बाइट प्राप्त करने के लिए नीचे दिए गए कोड स्निपेट का उपयोग करें

protected byte[] GetCSVFileContent(string fileName)
    {
        StringBuilder sb = new StringBuilder();
        using (StreamReader sr = new StreamReader(fileName, Encoding.Default, true))
        {
            String line;
            // Read and display lines from the file until the end of 
            // the file is reached.
            while ((line = sr.ReadLine()) != null)
            {
                sb.AppendLine(line);
            }
        }
        string allines = sb.ToString();


        UTF8Encoding utf8 = new UTF8Encoding();


        var preamble = utf8.GetPreamble();

        var data = utf8.GetBytes(allines);


        return data;
    }

नीचे कॉल करें और इसे अनुलग्नक के रूप में सहेजें

           Encoding csvEncoding = Encoding.UTF8;
                   //byte[] csvFile = GetCSVFileContent(FileUpload1.PostedFile.FileName);
          byte[] csvFile = GetCSVFileContent("Your_CSV_File_NAme");


        string attachment = String.Format("attachment; filename={0}.csv", "uomEncoded");

        Response.Clear();
        Response.ClearHeaders();
        Response.ClearContent();
        Response.ContentType = "text/csv";
        Response.ContentEncoding = csvEncoding;
        Response.AppendHeader("Content-Disposition", attachment);
        //Response.BinaryWrite(csvEncoding.GetPreamble());
        Response.BinaryWrite(csvFile);
        Response.Flush();
        Response.End();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.