ইউটিএফ -8 বাইট [] কী স্ট্রিংয়ে রূপান্তর করবেন?


931

আমার কাছে এমন একটি byte[]অ্যারে রয়েছে যা একটি ফাইল থেকে লোড হয় যা আমি জানতে পারি যেটি ইউটিএফ -8 রয়েছে ।

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

কভারগুলির নীচে এটি কেবলমাত্র একটি বরাদ্দ এবং একটি মেমকোপি হওয়া উচিত , সুতরাং এটি প্রয়োগ না করা হলেও এটি সম্ভব হওয়া উচিত।


5
"কেবলমাত্র একটি বরাদ্দ এবং একটি মেমকোপি হওয়া উচিত": সঠিক নয় কারণ .NET স্ট্রিংটি ইউটিএফ -16 এনকোডযুক্ত। একটি ইউনিকোড অক্ষর একটি ইউটিএফ -8 কোড ইউনিট বা একটি ইউটিএফ -16 কোড ইউনিট হতে পারে। অন্যটি দুটি UTF-8 কোড ইউনিট বা একটি UTF-16 কোড ইউনিট হতে পারে, অন্যটি তিনটি UTF-8 কোড ইউনিট বা একটি UTF-16 কোড ইউনিট হতে পারে, অন্যটি চারটি UTF-8 কোড ইউনিট বা দুটি UTF-16 কোড ইউনিট হতে পারে । একটি মেমকোপি প্রশস্ত করতে সক্ষম হতে পারে তবে এটি ইউটিএফ -8 থেকে ইউটিএফ -16 রূপান্তর করতে সক্ষম হয় না।
টম ব্লডজেট

উত্তর:


1468
string result = System.Text.Encoding.UTF8.GetString(byteArray);

13
এটি নাল শেষের স্ট্রিংগুলি কীভাবে পরিচালনা করবে?
maazza

14
@ maazza অজানা কারণে এটি মোটেও হয় না। আমি এ জাতীয় ফোন করছি System.Text.Encoding.UTF8.GetString(buf).TrimEnd('\0');
হাই-এঞ্জেল

15
@ হাই-অ্যাঞ্জেল অজানা কারণ? নাল-টার্মিনেটেড স্ট্রিংগুলি সর্বদা জনপ্রিয় হওয়ার একমাত্র কারণ ছিল সি ভাষা - এবং এটি কেবলমাত্র একটি historicalতিহাসিক বিজোড়তার কারণে (সিপিইউ নির্দেশাবলী যা নাল-টার্মিনেটেড স্ট্রিংগুলি নিয়ে কাজ করে)। .NET কেবল নাল-টার্মিনেটেড স্ট্রিংগুলি কোড ব্যবহার করে যখন নাল-টার্মিনেটেড স্ট্রিংগুলি ব্যবহার করে (যা শেষ অবধি অদৃশ্য হয়ে যায়) ব্যবহার করে inter কোনও স্ট্রিংতে NUL টি অক্ষর থাকতে পারে এটি পুরোপুরি বৈধ। এবং অবশ্যই, নাল-টার্মিনেটেড স্ট্রিংগুলি এএসসিআইআই-তে মরে যাওয়া সহজ (আপনি প্রথম শূন্য বাইট না পাওয়া পর্যন্ত কেবল তৈরি করুন), ইউটিএফ -8 সহ অন্যান্য এনকোডিংগুলি এত সহজ নয়।
লুয়ান

4
ইউটিএফ -8 এর একটি সুন্দর বৈশিষ্ট্য হ'ল একটি ছোট ক্রম কখনও লম্বা সিকোয়েন্সের অনুচ্ছেদ হয় না। সুতরাং একটি নাল টার্মিনেটেড ইউটিএফ -8 স্ট্রিংটি সহজ।
প্লাগওয়াশ

10
ভাল, ভাগ্য যদি এটি অ-এসিআই থাকে তবে আনপ্যাক করা। শুধু কনভার্ট করুন.টোবেস 64 স্ট্রিং ব্যবহার করুন।
এরিক বার্গস্টেট

323

এই রূপান্তরটি করার জন্য কমপক্ষে চারটি ভিন্ন উপায় রয়েছে।

  1. এনকোডিংয়ের গেটস্ট্রিং
    , তবে যদি সেই বাইটগুলিতে অ-এসসিআইআই অক্ষর না থাকে তবে আপনি মূল বাইটগুলি ফিরে পেতে পারবেন না।

  2. বিটকনভার্টার.টস্ট্রিং
    আউটপুটটি একটি "-" সীমানাযুক্ত স্ট্রিং হয় তবে স্ট্রিংটিকে বাইট অ্যারেতে রূপান্তর করার জন্য NET বিল্ট-ইন পদ্ধতি নেই।


  3. রূপান্তর করুন.টোবেস St৪ স্ট্রিং আপনি সহজেই আউটপুট স্ট্রিংটি ব্যবহার করে ফিরে বাইট অ্যারেতে রূপান্তর করতে পারেন Convert.FromBase64String
    দ্রষ্টব্য: আউটপুট স্ট্রিংয়ে '+', '/' এবং '=' থাকতে পারে। আপনি যদি কোনও ইউআরএলটিতে স্ট্রিংটি ব্যবহার করতে চান তবে আপনাকে এটিকে স্পষ্টভাবে এনকোড করা দরকার।

  4. এইচটিপিএসবারস ইউটিলিটি.আরলটোকেন এনকোড
    আপনি সহজেই আউটপুট স্ট্রিংটি ফিরিয়ে বাইট অ্যারে ব্যবহার করে রূপান্তর করতে পারেন HttpServerUtility.UrlTokenDecode। আউটপুট স্ট্রিং ইতিমধ্যে ইউআরএল বান্ধব! System.Webআপনার প্রকল্পটি কোনও ওয়েব প্রকল্প না হলে এর বিধানসভা দরকার ।

একটি সম্পূর্ণ উদাহরণ:

byte[] bytes = { 130, 200, 234, 23 }; // A byte array contains non-ASCII (or non-readable) characters

string s1 = Encoding.UTF8.GetString(bytes); // ���
byte[] decBytes1 = Encoding.UTF8.GetBytes(s1);  // decBytes1.Length == 10 !!
// decBytes1 not same as bytes
// Using UTF-8 or other Encoding object will get similar results

string s2 = BitConverter.ToString(bytes);   // 82-C8-EA-17
String[] tempAry = s2.Split('-');
byte[] decBytes2 = new byte[tempAry.Length];
for (int i = 0; i < tempAry.Length; i++)
    decBytes2[i] = Convert.ToByte(tempAry[i], 16);
// decBytes2 same as bytes

string s3 = Convert.ToBase64String(bytes);  // gsjqFw==
byte[] decByte3 = Convert.FromBase64String(s3);
// decByte3 same as bytes

string s4 = HttpServerUtility.UrlTokenEncode(bytes);    // gsjqFw2
byte[] decBytes4 = HttpServerUtility.UrlTokenDecode(s4);
// decBytes4 same as bytes

7
এটি var decBytes2 = str.Split('-').Select(ch => Convert.ToByte(ch, 16)).ToArray();
লিনকিউ করুন

25

আপনি যখন এনকোডিংটি জানেন না তখন বাইট অ্যারে থেকে স্ট্রিংয়ে রূপান্তর করার একটি সাধারণ সমাধান:

static string BytesToStringConverted(byte[] bytes)
{
    using (var stream = new MemoryStream(bytes))
    {
        using (var streamReader = new StreamReader(stream))
        {
            return streamReader.ReadToEnd();
        }
    }
}

3
তবে এটি ধরে নিয়েছে যে বাইট স্ট্রিমে হয় একটি এনকোডিং বিওএম আছে বা এটি ইউটিএফ -8 এ রয়েছে। তবে আপনি যেভাবেই এনকোডিংয়ের মাধ্যমে একই কাজ করতে পারেন। আপনি যখন এনকোডিংটি জানেন না তখন এটি যাদুতে সমস্যার সমাধান করে না।
সেবাস্তিয়ান জান্ডার

12

সংজ্ঞা:

public static string ConvertByteToString(this byte[] source)
{
    return source != null ? System.Text.Encoding.UTF8.GetString(source) : null;
}

ব্যবহার:

string result = input.ConvertByteToString();

9

রূপান্তর একটি byte[]একটি থেকে stringসহজ বলে মনে হয় কিন্তু এনকোডিং যে কোন ধরণের আপ আউটপুট স্ট্রিং জগাখিচুড়ি করার সম্ভাবনা রয়েছে। এই সামান্য ফাংশনটি কেবল কোনও অপ্রত্যাশিত ফলাফল ছাড়াই কাজ করে:

private string ToString(byte[] bytes)
{
    string response = string.Empty;

    foreach (byte b in bytes)
        response += (Char)b;

    return response;
}

আমি কনভার্ট.ফর্মবেস St৪ স্ট্রিংয়ের সাথে আনপ্যাক করলে আমি আপনার পদ্ধতিটি ব্যবহার করে সিস্টেম.ফর্ম্যাটএক্সসেপশন পেয়েছি।
এরিক বার্গস্টেট

@ অ্যান্ড্রুজেই ছবিগুলি থেকে ব্যবহৃত একটি বৃহত বাইট অ্যারে থাকলে আপনার এটি গণনা করতেও সময় লাগবে।
ব্যবহারকারী3841581

7

ব্যবহার (byte)b.ToString("x2"), আউটপুটb4b5dfe475e58b67

public static class Ext {

    public static string ToHexString(this byte[] hex)
    {
        if (hex == null) return null;
        if (hex.Length == 0) return string.Empty;

        var s = new StringBuilder();
        foreach (byte b in hex) {
            s.Append(b.ToString("x2"));
        }
        return s.ToString();
    }

    public static byte[] ToHexBytes(this string hex)
    {
        if (hex == null) return null;
        if (hex.Length == 0) return new byte[0];

        int l = hex.Length / 2;
        var b = new byte[l];
        for (int i = 0; i < l; ++i) {
            b[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
        }
        return b;
    }

    public static bool EqualsTo(this byte[] bytes, byte[] bytesToCompare)
    {
        if (bytes == null && bytesToCompare == null) return true; // ?
        if (bytes == null || bytesToCompare == null) return false;
        if (object.ReferenceEquals(bytes, bytesToCompare)) return true;

        if (bytes.Length != bytesToCompare.Length) return false;

        for (int i = 0; i < bytes.Length; ++i) {
            if (bytes[i] != bytesToCompare[i]) return false;
        }
        return true;
    }

}

4

ক্লাস ইউনিকোডএইনকোডিং রয়েছে, ব্যবহারে বেশ সহজ:

ByteConverter = new UnicodeEncoding();
string stringDataForEncoding = "My Secret Data!";
byte[] dataEncoded = ByteConverter.GetBytes(stringDataForEncoding);

Console.WriteLine("Data after decoding: {0}", ByteConverter.GetString(dataEncoded));

তবে ইউটিএফ -8 মেথিংকস নয়?
ডেভিড.পিএফএফএক্স

1
UnicodeEncodingএটি এখন পর্যন্ত সবচেয়ে খারাপ শ্রেণির নাম; ইউনিকোড মোটেই এনকোডিং নয়। সেই শ্রেণিটি আসলে ইউটিএফ -16। আমার মনে হয় ছোট্ট এন্ডিয়ান সংস্করণ।
নাইয়ারগডস

3

বিকল্পভাবে:

 var byteStr = Convert.ToBase64String(bytes);

2

byteArrFilenameএকটি ফাইল থেকে পঠিত বাইট অ্যারেটিকে বিশুদ্ধ আসকি সি-স্টাইলের শূন্য-সমাপ্ত স্ট্রিংয়ে রূপান্তর করার জন্য একটি লিনক ওয়ান-লাইনারটি হ'ল : পুরানো সংরক্ষণাগার বিন্যাসে ফাইল সূচী টেবিলের মতো জিনিসগুলি পড়ার জন্য সহজ।

String filename = new String(byteArrFilename.TakeWhile(x => x != 0)
                              .Select(x => x < 128 ? (Char)x : '?').ToArray());

আমি '?'এখানে খাঁটি অ্যাস্কিই নয় এমন কোনও কিছুর জন্য ডিফল্ট চর হিসাবে ব্যবহার করি তবে অবশ্যই এটি পরিবর্তন করা যায়। আপনি যদি এটি সনাক্ত করতে পারেন তা নিশ্চিত হতে চান তবে কেবল '\0'পরিবর্তে ব্যবহার করুন, কারণ TakeWhileশুরুতে নিশ্চিত করা হয় যে এইভাবে নির্মিত একটি স্ট্রিং সম্ভবত '\0'ইনপুট উত্সের মানগুলি ধারণ করতে পারে না ।


2

BitConverterবর্গ একটি রূপান্তর করতে ব্যবহার করা যেতে পারে byte[]থেকে string

var convertedString = BitConverter.ToString(byteAttay);

BitConverterক্লাসের ডকুমেন্টেশন এমএসডিএন- তে প্রচুর পরিমাণে হতে পারে


1
এটি বাইট অ্যারেটিকে প্রতিটি বাইটকে উপস্থাপন করে একটি হেক্সাডেসিমাল স্ট্রিংতে রূপান্তর করে, যা বাইটকে স্ট্রিংয়ে রূপান্তর করার সময় আপনি যা চান তা সাধারণত নয়। যদি আপনি এটি করেন, তবে এটি অন্য প্রশ্ন, উদাহরণস্বরূপ দেখুন কীভাবে আপনি বাইট অ্যারেটিকে হেক্সাডেসিমাল স্ট্রিংয়ে রূপান্তর করবেন এবং বিপরীতভাবে?
কোডকাস্টার

ওপি যা চেয়েছিল তা নয়
শীতকালীন

2

আমার জ্ঞান অনুসারে, প্রদত্ত উত্তরগুলির মধ্যে কোনওটি নাল সমাপ্তির সাথে সঠিক আচরণের গ্যারান্টি দেয়। যতক্ষণ না কেউ আমাকে অন্যভাবে দেখায় আমি নিম্নলিখিত পদ্ধতিগুলি সহ এটি পরিচালনা করার জন্য নিজের স্ট্যাটিক ক্লাসটি লিখেছিলাম:

// Mimics the functionality of strlen() in c/c++
// Needed because niether StringBuilder or Encoding.*.GetString() handle \0 well
static int StringLength(byte[] buffer, int startIndex = 0)
{
    int strlen = 0;
    while
    (
        (startIndex + strlen + 1) < buffer.Length // Make sure incrementing won't break any bounds
        && buffer[startIndex + strlen] != 0       // The typical null terimation check
    )
    {
        ++strlen;
    }
    return strlen;
}

// This is messy, but I haven't found a built-in way in c# that guarentees null termination
public static string ParseBytes(byte[] buffer, out int strlen, int startIndex = 0)
{
    strlen = StringLength(buffer, startIndex);
    byte[] c_str = new byte[strlen];
    Array.Copy(buffer, startIndex, c_str, 0, strlen);
    return Encoding.UTF8.GetString(c_str);
}

এর কারণটি startIndexছিল আমি যে উদাহরণে কাজ করছি তা ছিল বিশেষত আমাকে byte[]নাল টার্মিনেটেড স্ট্রিংগুলির একটি অ্যারে হিসাবে পার্স করা দরকার । এটি সাধারণ ক্ষেত্রে নিরাপদে উপেক্ষা করা যেতে পারে


আমার, আসলে। byteArr.TakeWhile(x => x != 0)নাল টার্মিনেশন সমস্যা সমাধানের একটি দ্রুত এবং সহজ উপায়।
নাইয়ারগডস

1

হাইয়ার এমন একটি ফলাফল যা আপনাকে এনকোডিংয়ের সাথে বিরক্ত করতে হয়নি। আমি এটি আমার নেটওয়ার্ক ক্লাসে ব্যবহার করেছি এবং এর সাথে স্ট্রিং হিসাবে বাইনারি অবজেক্টগুলি প্রেরণ করেছি।

        public static byte[] String2ByteArray(string str)
        {
            char[] chars = str.ToArray();
            byte[] bytes = new byte[chars.Length * 2];

            for (int i = 0; i < chars.Length; i++)
                Array.Copy(BitConverter.GetBytes(chars[i]), 0, bytes, i * 2, 2);

            return bytes;
        }

        public static string ByteArray2String(byte[] bytes)
        {
            char[] chars = new char[bytes.Length / 2];

            for (int i = 0; i < chars.Length; i++)
                chars[i] = BitConverter.ToChar(bytes, i * 2);

            return new string(chars);
        }

একটি ছিল না। তবে এই ফাংশনটি আমাদের সংস্থা-নেটওয়ার্কে বাইনারি সংক্রমণের জন্য ব্যবহৃত এবং এখনও পর্যন্ত 20 টিবি সঠিকভাবে এনকোড করা হয়েছিল। সুতরাং আমার জন্য এই ফাংশনটি কাজ করে :)
মার্কো পার্দো

1

নির্বাচিত উত্তরের জন্য, আপনি যদি .NET35 বা .NET35 সিই ব্যবহার করছেন, আপনাকে ডিকোড করতে প্রথম বাইটের সূচক এবং ডিকোড করতে বাইটের সংখ্যা উল্লেখ করতে হবে:

string result = System.Text.Encoding.UTF8.GetString(byteArray,0,byteArray.Length);

0

এই কনসোল অ্যাপটি ব্যবহার করে দেখুন:

static void Main(string[] args)
{
    //Encoding _UTF8 = Encoding.UTF8;
    string[] _mainString = { "Héllo World" };
    Console.WriteLine("Main String: " + _mainString);

    //Convert a string to utf-8 bytes.
    byte[] _utf8Bytes = Encoding.UTF8.GetBytes(_mainString[0]);

    //Convert utf-8 bytes to a string.
    string _stringuUnicode = Encoding.UTF8.GetString(_utf8Bytes);
    Console.WriteLine("String Unicode: " + _stringuUnicode);
}

0

আমি এই পোস্টে কিছু উত্তর দেখেছি এবং এটি সম্পূর্ণ বেস জ্ঞান হিসাবে বিবেচনা করা সম্ভব, কারণ একই সমস্যা সমাধানের জন্য সি # প্রোগ্রামিংয়ের বিভিন্ন পদ্ধতি রয়েছে। বিওমের সাথে খাঁটি ইউটিএফ -8 এবং ইউটিএফ -8 এর মধ্যে পার্থক্য সম্পর্কে কেবল একটি বিষয় বিবেচনা করা দরকার

গত সপ্তাহে, আমার কাজকালে, আমার একটি কার্যকারিতা বিকাশ করা দরকার যা বিওএম এবং সিএসভি ফাইলগুলিকে খাঁটি ইউটিএফ -8 (বিওএম ছাড়াই) দিয়ে আউটপুট করে দেয়, প্রতিটি সিএসভি ফাইল এনকোডিং প্রকারটি বিভিন্ন অ-মানকযুক্ত এপিআই দ্বারা গ্রাস করা হবে, এটি একটি এআইপিটি বিওএম সহ ইউটিএফ -8 এবং বিওএম ছাড়াই অন্য এপিআই পড়বে। আমার এই ধারণাটি সম্পর্কে রেফারেন্সগুলি নিয়ে গবেষণা করতে হবে, " বিওএম ছাড়াই ইউটিএফ -8 এবং ইউটিএফ -8 এর মধ্যে পার্থক্য কী? " আমার দৃষ্টিভঙ্গি তৈরির জন্য স্ট্যাক ওভারফ্লো আলোচনা এবং এই উইকিপিডিয়া লিঙ্ক " বাইট অর্ডার চিহ্ন "।

অবশেষে, উভয় ইউটিএফ -8 এনকোডিং প্রকারের (বিওএম এবং খাঁটি সহ) জন্য আমার সি # প্রোগ্রামিংয়ের এই উদাহরণটির মতো হওয়া দরকার:

//for UTF-8 with B.O.M., equals shared by Zanoni (at top)
string result = System.Text.Encoding.UTF8.GetString(byteArray);

//for Pure UTF-8 (without B.O.M.)
string result = (new UTF8Encoding(false)).GetString(byteArray);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.