আমি কীভাবে সি # তে স্ট্রিংটিকে ইউটিএফ -8 এ রূপান্তর করতে পারি?


146

আমার কাছে একটি স্ট্রিং রয়েছে যা আমি তৃতীয় পক্ষের অ্যাপ থেকে পেয়েছি এবং আমি এটি আমার উইন্ডোজ সারফেসে সি # ব্যবহার করে যে কোনও ভাষায় সঠিকভাবে প্রদর্শন করতে চাই।

ভুল এনকোডিংয়ের কারণে, আমার স্ট্রিংয়ের একটি অংশ স্প্যানিশ ভাষায় এইরকম দেখাচ্ছে:

Acción

যদিও এটি দেখতে এইরকম হওয়া উচিত:

Acción

এই প্রশ্নের উত্তর অনুসারে: সি # তে স্ট্রিং এনকোডিংটি কীভাবে জানবেন , আমি যে এনকোডিংটি পাচ্ছি তা ইতিমধ্যে ইউটিএফ -8 এ আসা উচিত, তবে এটি এনকোডিং.ডাফল্ট (সম্ভবত এএনএসআই?) পড়তে হবে।

আমি এই স্ট্রিংটিকে বাস্তব ইউটিএফ -8 এ রূপান্তর করার চেষ্টা করছি, তবে একটি সমস্যা হ'ল আমি কেবল এনকোডিং শ্রেণির একটি উপসেট দেখতে পাচ্ছি (কেবলমাত্র ইউটিএফ 8 এবং ইউনিকোড বৈশিষ্ট্য), সম্ভবত আমি উইন্ডো পৃষ্ঠের এপিআইতে সীমাবদ্ধ রেখেছি বলেই।

আমি ইন্টারনেটে যে স্নিপেটগুলি পেয়েছি তা চেষ্টা করেছি, তবে পূর্বের ভাষার জন্য (যেমন কোরিয়ান) এখন পর্যন্ত তাদের কোনওটিই সফল প্রমাণিত হয়নি। একটি উদাহরণ নিম্নরূপ:

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

আমি স্ট্রিংটি বাইট অ্যারেতে বের করার চেষ্টা করে এবং তারপরে ইউটিএফ 8 ব্যবহার করেছিলাম। গেটস্ট্রিং:

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
আপনার সমস্যাটি কোড থেকে এসেছে যা স্ট্রিং তৈরি করেছে (একটি স্ট্রিম বা বাইট [] থেকে) প্রথম স্থানে। দয়া করে কোডটি দেখান।
স্ল্যাक्स

1
@ ওজেড:। নেট স্ট্রিংগুলি মেমোরিতে ইউটিএফ 16 হিসাবে সঞ্চিত হয়, তবে Encoding.Defaultসিস্টেমের এএনএসআই কোডপেজ দেয়।
SLaks

এখানে একটি স্ট্রিংয়ের উদাহরণ দেওয়া আছে যা ইংরেজি ভাষার ক্ষেত্রে কাজ করে না: দিনের প্রদর্শন না করে আমার প্রথম প্রান্তের অ্যাপটি প্রদর্শিত হচ্ছে: দিন€
গারা ডেস্ক

উত্তর:


251

আপনি জানেন যে স্ট্রিংটি আসবে Encoding.Defaultআপনি কেবল ব্যবহার করতে পারেন:

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

আপনার আরেকটি জিনিস মনে রাখতে পারে: আপনি যদি কিছু স্ট্রিং আউটপুট দেওয়ার জন্য কনসোল.ওরাইটলাইন ব্যবহার করেন, তবে আপনারও লেখা উচিত Console.OutputEncoding = System.Text.Encoding.UTF8;!!! বা সমস্ত ইউটিএফ 8 স্ট্রিংকে জিবিকে হিসাবে আউটপুট করা হবে ...


এটি খুব কার্যকর এটি আমার জবাবের চেয়ে আসলে খুব সুন্দর যা এটিও কাজ করে আমি আপনাকে একটি +1 সুন্দর কাজ
দিচ্ছি

ধন্যবাদ! সমস্যাটি হ'ল, আমি বর্ণনায় যেমন উল্লেখ করেছি, পৃষ্ঠের এপিআই অসম্পূর্ণ (কোনও এনকোডিং নেই ef ডিফল্ট আমার জন্য উপলব্ধ নেই)।
গারা

3
@ গারা: চেষ্টা করুন Encoding.GetEncoding(...); আপনাকে অন্য প্রান্তে ভুলভাবে ব্যবহৃত প্রকৃত এনকোডিংয়ের নামটি খুঁজে বের করতে হবে।
স্ল্যাक्स

1
আপনি ব্যাখ্যা করতে পারেন কেন এটি কাজ করে? যদি ডিফল্টটি GB2312 হয়, তবে এনকোডিং ef ​​ডিফল্ট.গেটবাইটস বাইট অ্যারে ব্যবহারের জন্য জিবি 2312 এনকোডারকে স্ট্রিংটি এনকোড করবে, তারপরে এনকোডিং UT আউট 8 @anothershrubery
guorongfei

1
@ গুওরাঙ্গফেই এর প্রথম ভিত্তিটি হ'ল মোজিবাকে myString। কোডটি প্রথমে ভুল ডিকোডিংটিকে পূর্বাবস্থায় ফিরিয়ে দেয় তারপরে সঠিক ডিকোডিং করে। এটি ততক্ষণ কাজ করে যতক্ষণ না ভুল ডিকোডিংয়ের ডেটা হারিয়ে যায়। তবে @ এসএলক্স যেমন উল্লেখ করেছেন, সঠিক এনকোডিংটি যেটি ভুল তা ব্যবহার করা ভাল। (কোডে আরও ভাল নাম এবং মন্তব্যগুলি বুঝতে পারে যে খুব ভ্রান্ত-বর্ণনামূলক কোডটি আসলে সঠিকভাবে করার চেষ্টা))
টম ব্লডজেট

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

দিনের দিনগুলি প্রদর্শন করে

ডিকোডফ্রুমআউটএফ 8 () কল করুন;

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

1
ধন্যবাদ! এটি স্প্যানিশ ভাষায় কাজ করে, সমস্যাটি হ'ল পূর্বের ভাষাগুলিতে (অর্থাত্ কোরিয়ান) একই কাজ করে না। আমি ইন্টারনেটে ইউটিএফ -8 রূপান্তর অ্যালগরিদমের জন্য একটি 8-বিট সন্ধান করার চেষ্টা করছি, তবে এখনও ভাগ্য নেই।
গারা

এখানে একটি স্ট্রিংয়ের উদাহরণ দেওয়া আছে যা ইংরেজি ভাষার ক্ষেত্রে কাজ করে না: দিনের প্রদর্শন না করে আমার প্রথম প্রান্তের অ্যাপটি প্রদর্শিত হচ্ছে: দিন€
গারা ডেস্ক

ঠিক আছে আমাকে এর সাথে জড়িয়ে পড়ুন এবং আমি কী নিয়ে আসতে পারি তা দেখুন
মেথডম্যান

আমি পরীক্ষা করেছিলাম এবং এটি ফিরে আসে আমি স্থির পদ্ধতিটি পরীক্ষা করেছিলাম যা এটি পরীক্ষিত হয়েছিল যা আসলে এটি
@ অনাদারশ্রুবারীর সরবরাহের মতোই

আপনি ডিকোডফ্রুমআউটএফ 8 (স্ট্রিং utf8string) পাস করে সেই পদ্ধতিটি পরিবর্তন করতে পারেন;
মেথডম্যান

12

আপনার কোডটি ইউটিএফ 8-এনকোডড বাইটের ক্রম পড়ছে এবং 8-বিট এনকোডিং ব্যবহার করে সেগুলি ডিকোড করছে।

বাইটগুলি ইউটিএফ 8 হিসাবে ডিকোড করার জন্য আপনাকে সেই কোডটি ঠিক করতে হবে।

বিকল্পভাবে ( আদর্শ নয় ), আপনি খারাপ স্ট্রিংটিকে মূল বাইট অ্যারেতে রূপান্তর করতে পারেন - ভুল এনকোডিং ব্যবহার করে এটি এনকোড করে — তারপরে ইউটিএফ 8 হিসাবে বাইটগুলি পুনরায় ডিকোড করুন।


ধন্যবাদ! সমস্যাটি হ'ল তৃতীয় পক্ষের অ্যাপ্লিকেশনটি সি ++, যখন আমার কোডটি সি #, সুতরাং আমি অনুমান করি যে এই দুটির মধ্যে "ব্রিজ" এ ডিকোডিং ঘটে।
গারা


5

আপনি যদি কোনও স্ট্রিং মাইএসকিএল ডাটাবেসে সংরক্ষণ করতে চান তবে এটি করুন: ->

আপনার ডাটাবেস ক্ষেত্রের কাঠামো আমি পিএইচপিএমইডমিন [বা অন্য কোনও কন্ট্রোল প্যানেল] utf8-জিনেরাল- সিআইতে সেট করা উচিত

2) আপনার স্ট্রিং পরিবর্তন করা উচিত [প্রাক্তন। টেক্সটবক্স 1.টিেক্সট] বাইট করা, তার জন্য

2-1) বাইট সংজ্ঞায়িত [] স্ট 2;

2-2) আপনার স্ট্রিং [টেক্সটবক্স 1.টেক্সট] কে ইউনিকোড [মিমিউলটিবাইট স্ট্রিং] এ রূপান্তর করুন:

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

3) যে কোনও প্রশ্নের আগে এই এসকিএল কমান্ডটি কার্যকর করুন:

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();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.