সি # রূপান্তরিত স্ট্রিংটি ইউটিএফ -8 থেকে আইএসও -8859-1 (লাতিন 1) এইচ এ দিন


103

আমি এই বিষয়টিতে গুগল করেছি এবং আমি প্রতিটি উত্তরের দিকে নজর রেখেছি, তবে আমি এখনও এটি পাই না।

মূলত আমাকে ইউটিএফ -8 স্ট্রিংটি আইএসও -8859-1 এ রূপান্তর করতে হবে এবং আমি নিম্নলিখিত কোড ব্যবহার করে এটি করি:

Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
string msg = iso.GetString(utf8.GetBytes(Message));

আমার উত্স স্ট্রিং হয়

Message = "ÄäÖöÕõÜü"

তবে দুর্ভাগ্যক্রমে আমার ফলাফলের স্ট্রিং হয়ে যায়

msg = "�ä�ö�õ�ü

আমি এখানে কি ভুল করছি?


5
.NET এর সমস্ত স্ট্রিং ইউনিকোড অক্ষর ব্যবহার করে স্ট্রিংগুলি অভ্যন্তরীণভাবে সঞ্চয় করে। স্ট্রিং "উইন্ডোজ-1252", "আইসো -8859-1", "utf-8" ইত্যাদির কোনও ধারণা নেই। আপনি কি উইন্ডোতে কোনও প্রতিনিধিত্ব না করে আপনার স্ট্রিংয়ে এমন কোনও অক্ষর ফেলে দেওয়ার চেষ্টা করছেন? -1252 কোড পৃষ্ঠা?
ইয়ান বয়ড

1
@ আইয়ানবয়েড প্রকৃতপক্ষে, একটি স্ট্রিং ইউটিএফ -16 কোড ইউনিটের একটি গণিত অনুক্রম। (দুর্ভাগ্যক্রমে, Encoding.Unicodeউইন 32 এপি এবং এ ইউনিকোড শব্দটি ভুলভাবে প্রয়োগ করা হয়েছে Un ইউনিকোড একটি অক্ষর সেট, কোনও এনকোডিং নয় U ইউটিএফ -16 ইউনিকোডের বেশ কয়েকটি এনকোডিংগুলির মধ্যে একটি।)
টম ব্লডজেট

1
আপনি ভুল ক্রিয়া করেন: আপনি utf8 এনকোডিংয়ে বাইট অ্যারে তৈরি করেন তবে আইসো ডিকোড দ্বারা সেগুলি পড়ুন। আপনি যদি এনকোডযুক্ত
StuS

এটাকে বলে মোজিবাকে।
রিক জেমস

আমার ধারণা, ড্যানিল যা বলছে তা হ'ল এটি Messageইউটিএফ -8 থেকে ডিকোড করা হয়েছিল। এই অংশটি সঠিকভাবে কাজ করেছে বলে ধরে নিলাম, লাতিন -১ এ রূপান্তর করা তত সহজ byte[] bytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(Message)। তারপরে, স্টুএসের মত, আপনি লাতিন -১ বাইটগুলি ইউটিএফ -16 এ ফিরে রূপান্তর করতে পারবেনEncoding.GetEncoding("ISO-8859-1").GetString(bytes)
কিউবার্টি

উত্তর:


176

আপনার গন্তব্য এনকোডিংয়ে ডিকোড করার চেষ্টা করার আগে বাইট অ্যারেটি সামঞ্জস্য করতে এনকোডিং ব্যবহার করুন vert

Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(Message);
byte[] isoBytes = Encoding.Convert(utf8, iso, utfBytes);
string msg = iso.GetString(isoBytes);

7
এক Encoding.GetEncoding("ISO-8859-1").GetString(Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("ISO-8859-1"), Encoding.UTF8.GetBytes(myString)))

1
আপনি যদি নিজে সি # /। নেট এর ভিতরে স্ট্রিং তৈরি করে থাকেন তবে এই কোডটি 100% সঠিক নয়, আপনাকে ইউটিএফ -16 (যা ভেরিয়েবল "ইউনিকোড") থেকে এনকোড করতে হবে। কারণ এটি ডিফল্ট। সুতরাং উপরের কোডে ইউটিএফ 8 ইউনিকোডে পরিবর্তন করতে হবে।
goamn

আমি এটি ব্যবহার করার পরামর্শ দিচ্ছি: এনকোডিং iso = এনকোডিং GGetEncoding ("আইএসও -8859-9"); কারণ তুরস্কের এনকোডিংটি লাতিন থেকে প্রসারিত সমস্ত বর্ণমালা জুড়ে।
ফুয়াত

26

আমি মনে করি আপনার সমস্যাটি হ'ল আপনি ধরে নিয়েছেন যে utf8 স্ট্রিংকে উপস্থাপন করা বাইটগুলি একই স্ট্রিংয়ের ফলস্বরূপ অন্য কিছু হিসাবে ব্যাখ্যা করলে (আইসো -8859-1)। এবং এটি কেবল কেস নয়। আমি আপনাকে সুপারিশ করছি যে আপনি জোয়েল স্পলস্কির এই দুর্দান্ত নিবন্ধটি পড়ুন।


1
দুর্দান্ত নিবন্ধটি সত্যই এবং একটি বোধের সাথে! আমি আজ কর্মক্ষেত্রে একটি এনকোডিংয়ের সমস্যার মুখোমুখি ছিলাম এবং এটি আমাকে সাহায্য করেছিল।
প্যান্টেলিস

16

এটা চেষ্টা কর:

Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(Message);
byte[] isoBytes = Encoding.Convert(utf8,iso,utfBytes);
string msg = iso.GetString(isoBytes);

আমি কেন একই utf-8 বার্তা পাচ্ছি? বার্তার জায়গায় আমি স্ট্রিং বার্তাটি << নাম> sdjfhsjdf </name> পাস করেছি then
ব্যবহারকারী 1237131

এটি আমার পক্ষে কাজ করে। System.Text নাম স্থান অন্তর্ভুক্ত মনে রাখবেন।
স্পোনারাইডার

2
এনকোডিং
on

8

আপনাকে প্রথমে স্ট্রিংয়ের উত্সটি ঠিক করতে হবে।

.NET- এ একটি স্ট্রিং আসলে 16-বিট ইউনিকোড কোড-পয়েন্ট, অক্ষরের একটি অ্যারে হয়, সুতরাং কোনও স্ট্রিং কোনও নির্দিষ্ট এনকোডিংয়ে থাকে না।

এটি যখন আপনি সেই স্ট্রিংটি নেন এবং এটিকে এনকোডিং খেলায় আসে এমন একটি বাইটের সেটগুলিতে রূপান্তর করেন।

যাই হোক না কেন, আপনি যেভাবে এটি করেছেন, একটি অক্ষর সেট সহ একটি বাইট অ্যারেতে একটি স্ট্রিং এনকোড করেছেন এবং তারপরে অন্যটির সাথে ডিকোডিং কার্যকর হবে না, যেমন আপনি দেখছেন।

সেই আসল স্ট্রিংটি কোথা থেকে এসেছে সে সম্পর্কে আপনি আমাদের আরও বলতে পারেন এবং কেন আপনি কেন এটি ভুল এনকোড করা হয়েছে বলে মনে করেন?


এটি সরাসরি অ্যাপকনফিগ থেকে আসছে এবং আমি ভাবছিলাম এটি ডিফল্টরূপে এটি ইউটিএফ 8। ধন্যবাদ!
ড্যানিল হারিক

এই ফাইলটির এনকোডিং ফাইলটিকে কীভাবে ব্যাখ্যা করতে পারে তার উপর প্রভাব ফেলতে পারে, তাই আমি এটির দিকে নজর দেব।
লাসে ভি কার্লসেন

2
আমি ভুল হলে আমাকে সংশোধন করুন, তবে আমার বোধগম্যতাটি হ'ল, যদিও প্রযুক্তিগতভাবে এটি "কোনও নির্দিষ্ট এনকোডিংয়ে নেই", একটি .NET স্ট্রিং একটি বাইট অ্যারে যা একটি ইউটিএফ -16 ফাইলের সাথে বাইটের জন্য বাইট (বাদ ব্যতীত) বিওএম)। এমনকি এটি সারোগেটগুলি একইভাবে ব্যবহার করে (যা এনকোডিংয়ের মতো বলে মনে হয়)। অবশ্যই, আপনি সাধারণত ফাইলগুলি UTF-8 হিসাবে সঞ্চয় করতে চান তবে মেমরিতে ডেটাটি 16-বিট হিসাবে প্রসেস করতে পারেন। (বা 32-বিট, সারোগেট জোড়গুলির জটিলতা এড়াতে, যদিও এটি সত্যিই সম্ভব কিনা তা আমি নিশ্চিত নই।)
জন কোম্বস

6

বিটটি অদ্ভুত কোড বলে মনে হচ্ছে। ইউটিএফ 8 বাইট স্ট্রিম থেকে স্ট্রিং পেতে আপনাকে যা করতে হবে তা হ'ল:

string str = Encoding.UTF8.GetString(utf8ByteArray);

আপনার যদি আইসো -8859-1 বাইট স্ট্রিমটি কোথাও সংরক্ষণ করতে হয় তবে কেবল ব্যবহার করুন: পূর্ববর্তী কোডগুলির অতিরিক্ত লাইন:

byte[] iso88591data = Encoding.GetEncoding("ISO-8859-1").GetBytes(str);

1
এটি স্পষ্টভাবে সবচেয়ে সহজ উত্তর। কোডটিতে সমস্যাটি হ'ল লেখক মনে করছেন যে সি # তে একটি স্ট্রিং ইতিমধ্যে একটি নির্দিষ্ট এনকোডিং "ব্যবহার করে" সংরক্ষণ করা যেতে পারে, যা কেবল সত্য নয়; তারা সর্বদা অভ্যন্তরীণভাবে ইউটিএফ 16 থাকে।
নাইয়ারগডস

1
সম্পুর্ন একমত. আপনার যদি ইতিমধ্যে ইউটিএফ -১ have থাকে, তখন এটি সঠিক এনকোডিংয়ে পরিণত করা বেশ শক্ত কারণ আপনি যখন বাইট অ্যারেটিকে ভুল এনকোডিংয়ের সাথে স্ট্রিংয়ে রূপান্তর করেন তখন ইতিমধ্যে তথ্যের ক্ষতি হয়।
স্যান্ডার এ

0

স্রেফ নাথানের সমাধান ব্যবহার করেছেন এবং এটি দুর্দান্ত কাজ করে। আমার ইউএসও -8859-1 ইউনিকোডে রূপান্তর করতে হবে:

string isocontent = Encoding.GetEncoding("ISO-8859-1").GetString(fileContent, 0, fileContent.Length);
byte[] isobytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(isocontent);
byte[] ubytes = Encoding.Convert(Encoding.GetEncoding("ISO-8859-1"), Encoding.Unicode, isobytes);
return Encoding.Unicode.GetString(ubytes, 0, ubytes.Length);

0
Encoding targetEncoding = Encoding.GetEncoding(1252);
// Encode a string into an array of bytes.
Byte[] encodedBytes = targetEncoding.GetBytes(utfString);
// Show the encoded byte values.
Console.WriteLine("Encoded bytes: " + BitConverter.ToString(encodedBytes));
// Decode the byte array back to a string.
String decodedString = Encoding.Default.GetString(encodedBytes);

-5

এখানে আইএসও -8859-9 এর একটি নমুনা দেওয়া হয়েছে;

protected void btnKaydet_Click(object sender, EventArgs e)
{
    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "application/vnd.openxmlformatsofficedocument.wordprocessingml.documet";
    Response.AddHeader("Content-Disposition", "attachment; filename=XXXX.doc");
    Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-9");
    Response.Charset = "ISO-8859-9";
    EnableViewState = false;


    StringWriter writer = new StringWriter();
    HtmlTextWriter html = new HtmlTextWriter(writer);
    form1.RenderControl(html);


    byte[] bytesInStream = Encoding.GetEncoding("iso-8859-9").GetBytes(writer.ToString());
    MemoryStream memoryStream = new MemoryStream(bytesInStream);


    string msgBody = "";
    string Email = "mail@xxxxxx.org";
    SmtpClient client = new SmtpClient("mail.xxxxx.org");
    MailMessage message = new MailMessage(Email, "mail@someone.com", "ONLINE APP FORM WITH WORD DOC", msgBody);
    Attachment att = new Attachment(memoryStream, "XXXX.doc", "application/vnd.openxmlformatsofficedocument.wordprocessingml.documet");
    message.Attachments.Add(att);
    message.BodyEncoding = System.Text.Encoding.UTF8;
    message.IsBodyHtml = true;
    client.Send(message);}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.