যে কোনও ফাইলের এনকোডিং কার্যকর করার উপায়


115

হ্যাঁ একটি প্রায়শই প্রশ্ন এবং এটি আমার পক্ষে অস্পষ্ট এবং যেহেতু আমি এ সম্পর্কে খুব বেশি জানি না।

তবে আমি একটি ফাইল এনকোডিং সন্ধানের খুব সঠিক উপায় চাই way নোটপ্যাড ++ হিসাবে ঠিক তাই।



কোন এনকোডিংস? ইউটিএফ -8 বনাম ইউটিএফ -16, বড় বনাম ছোট এন্ডিয়ান? অথবা আপনি পুরানো এমএসডোস কোডপেজগুলি উল্লেখ করছেন, যেমন শিফট-জেআইএস বা সিরিলিক ইত্যাদি?
dthorpe

অন্য সম্ভাব্য সদৃশ: stackoverflow.com/questions/436220/...
ওবেদের

@ ওডে: উদ্ধৃত করুন "getEncoding () পদ্ধতিটি সেই এনকোডিংটি ফিরিয়ে দেবে যা স্রোতের জন্য সেট আপ করা হয়েছিল (জাভাডক পড়ুন) It এটি আপনার জন্য এনকোডিং অনুমান করবে না" "
ফ্যাবিও অ্যান্টুনস

2
কিছু ব্যাকগ্রাউন্ড পড়ার জন্য, joelonsoftware.com/articles/Unicode.html একটি ভাল পঠন। পাঠ্য সম্পর্কে যদি আপনার একটি জিনিস জানা উচিত তবে তা সাধারণ পাঠ্যের মতো কোনও জিনিস নেই as
মার্টিজন

উত্তর:


155

StreamReader.CurrentEncodingসম্পত্তি কদাচিৎ সঠিক টেক্সট ফাইল আমার জন্য এনকোডিং ফেরৎ। আমার কোনও বাইট অর্ডার চিহ্ন (বিওএম) বিশ্লেষণ করে কোনও ফাইলের শেষতা নির্ধারণ করতে আরও বেশি সাফল্য পেয়েছি। যদি ফাইলটির কোনও বিওএম না থাকে তবে এটি ফাইলটির এনকোডিং নির্ধারণ করতে পারে না।

ইউটিএফ -32 এলএ সনাক্তকরণ এবং ইউটিএফ -32 বিইয়ের জন্য সঠিক এনকোডিং ফিরিয়ে আনতে 4/08/2020 আপডেট হয়েছে

/// <summary>
/// Determines a text file's encoding by analyzing its byte order mark (BOM).
/// Defaults to ASCII when detection of the text file's endianness fails.
/// </summary>
/// <param name="filename">The text file to analyze.</param>
/// <returns>The detected encoding.</returns>
public static Encoding GetEncoding(string filename)
{
    // Read the BOM
    var bom = new byte[4];
    using (var file = new FileStream(filename, FileMode.Open, FileAccess.Read))
    {
        file.Read(bom, 0, 4);
    }

    // Analyze the BOM
    if (bom[0] == 0x2b && bom[1] == 0x2f && bom[2] == 0x76) return Encoding.UTF7;
    if (bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf) return Encoding.UTF8;
    if (bom[0] == 0xff && bom[1] == 0xfe && bom[2] == 0 && bom[3] == 0) return Encoding.UTF32; //UTF-32LE
    if (bom[0] == 0xff && bom[1] == 0xfe) return Encoding.Unicode; //UTF-16LE
    if (bom[0] == 0xfe && bom[1] == 0xff) return Encoding.BigEndianUnicode; //UTF-16BE
    if (bom[0] == 0 && bom[1] == 0 && bom[2] == 0xfe && bom[3] == 0xff) return new UTF32Encoding(true, true);  //UTF-32BE

    // We actually have no idea what the encoding is if we reach this point, so
    // you may wish to return null instead of defaulting to ASCII
    return Encoding.ASCII;
}

3
+1 টি। এটি আমার পক্ষেও কাজ করেছে (যেখানে ডিটেক্ট এনকোডিংফর্মবাইট অর্ডারমার্কস করেনি)। আইওএক্সেপশন এড়ানোর জন্য আমি "নতুন ফাইল স্ট্রিম (ফাইলের নাম, ফাইলমোড.অপেন, ফাইলঅ্যাক্সেস.আরে পড়া)" ব্যবহার করেছি কারণ ফাইলটি কেবল পঠনযোগ্য।
পলিফুন

56
ইউটিএফ -8 ফাইলগুলি বিওএম ছাড়াই থাকতে পারে, এক্ষেত্রে এটি ASCII ভুলভাবে ফিরে আসবে।
ব্যবহারকারী 626528

3
এই উত্তরটি ভুল। এর জন্য রেফারেন্স উত্সটির দিকে তাকানো StreamReader, সেই বাস্তবায়নই আরও বেশি লোকেরা চাইবে। তারা বিদ্যমান Encoding.Unicodeঅবজেক্টগুলি ব্যবহার না করে নতুন এনকোডিংগুলি তৈরি করে , তাই সাম্যতার চেকগুলি ব্যর্থ হবে (যা খুব কমই ঘটতে পারে কারণ উদাহরণস্বরূপ, Encoding.UTF8বিভিন্ন বস্তু ফিরে আসতে পারে), তবে এটি (1) সত্যই অদ্ভুত UTF-7 ফর্ম্যাটটি ব্যবহার করে না, (২) কোনও বিওএম না পাওয়া গেলে ইউটিএফ -8 এ ডিফল্ট, এবং (3) আলাদা ডিফল্ট এনকোডিং ব্যবহার করতে ওভাররাইড করা যেতে পারে।
হ্যাঙ্গার

2
আমি নতুন স্ট্রিমরিডার (ফাইলের নাম, সত্য) দিয়ে আরও ভাল সাফল্য পেয়েছি urrentকেন্দ্রিক এনকোডিং
বেনোইট

4
কোডটিতে একটি মৌলিক ত্রুটি রয়েছে; আপনি যখন বড়-এন্ডিয়ান ইউটিএফ 32 স্বাক্ষর সনাক্ত করেন ( 00 00 FE FF), আপনি সিস্টেম-সরবরাহিত ফিরিয়ে দেন Encoding.UTF32, এটি একটি সামান্য এন্ডিয়ান এনকোডিং ( এখানে উল্লিখিত হিসাবে )। এবং এছাড়াও, যেমন @Nyerguds দ্বারা লক্ষনীয়, আপনি কি এখনও UTF32LE, যা স্বাক্ষর হয়েছে খুঁজছেন নেই FF FE 00 00(অনুযায়ী en.wikipedia.org/wiki/Byte_order_mark )। যেহেতু সেই ব্যবহারকারী উল্লেখ করেছেন, যেহেতু এটি চলাচল করছে, সেই চেকটি অবশ্যই 2-বাইট চেকের আগে আসবে।
গ্লেন স্লেডেন

44

StreamReaderক্লাসটি ব্যবহার করে নিম্নলিখিত কোডটি আমার পক্ষে ভাল কাজ করে :

  using (var reader = new StreamReader(fileName, defaultEncodingIfNoBom, true))
  {
      reader.Peek(); // you need this!
      var encoding = reader.CurrentEncoding;
  }

কৌশলটি হ'ল Peekকলটি ব্যবহার করা , অন্যথায়, .NET কিছুই করেনি (এবং এটি বিএমও প্রিমামালটি পড়েনি)। অবশ্যই, আপনি যদি ReadXXXএনকোডিং যাচাই করার আগে অন্য কোনও কল ব্যবহার করেন, এটি খুব কার্যকর হয়।

যদি ফাইলটির কোনও বিওএম না থাকে তবে defaultEncodingIfNoBomএনকোডিংটি ব্যবহার করা হবে। এই ওভারলোড পদ্ধতি ব্যতীত একটি স্ট্রিমরিডারও রয়েছে (এই ক্ষেত্রে, ডিফল্ট (এএনএসআই) এনকোডিংটি ডিফল্ট এনকোডিংআইফনোবম হিসাবে ব্যবহৃত হবে), তবে আপনি আপনার প্রসঙ্গে ডিফল্ট এনকোডিংটি কী বিবেচনা করবেন তা সংজ্ঞায়িত করতে পুনরায় সুপারিশ করছি।

আমি এটি ইউটিএফ 8, ইউটিএফ 16 / ইউনিকোড (এলই ও বিই) এবং ইউটিএফ 32 (এলই ও বিই) এর সাথে বিওএমের সাথে ফাইলগুলির সাথে সফলভাবে পরীক্ষা করেছি। এটি ইউটিএফ 7 এর জন্য কাজ করে না।


আমি ডিফল্ট এনকোডিং হিসাবে সেট সেট ফিরে। আমি কি কিছু মিস করছি?
রাম

1
@ ড্রাম - ফাইলটির কোনও বিওএম না থাকলে এটি ঘটতে পারে
সাইমন মউরিয়ার 15'16

ধন্যবাদ @ সিমন মুরিয়ার আমি আশা করি আমার পিডিএফ / কোনও ফাইল বোমা না থাকতে পারে। বোম ছাড়াই সনাক্ত করার চেষ্টা করা এমন ব্যক্তির পক্ষে এই লিঙ্কটি স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 201৪০৪৮৪/২ সহায়ক হতে পারে।
রাম

1
পাওয়ারশেলে আমাকে $ রিডারক্লোজ () চালাতে হয়েছিল, অন্যথায় এটি লেখা থেকে লক হয়ে গেছে। foreach($filename in $args) { $reader = [System.IO.StreamReader]::new($filename, [System.Text.Encoding]::default,$true); $peek = $reader.Peek(); $reader.currentencoding | select bodyname,encodingname; $reader.close() }
js2010

1
@ সিমনমুরিয়ার ফাইলের এনকোডিংটি এটি কাজ করে নাUTF-8 without BOM
ওজকান

11

আমি নিম্নলিখিত পদক্ষেপ চেষ্টা করে দেখুন:

1) কোনও বাইট অর্ডার চিহ্ন আছে কিনা তা পরীক্ষা করে দেখুন

2) ফাইলটি বৈধ UTF8 কিনা তা পরীক্ষা করে দেখুন

3) স্থানীয় "এএনএসআই" কোডপেজ ব্যবহার করুন (মাইক্রোসফ্ট এটি সংজ্ঞায়িত করে এএনএসআই)

পদক্ষেপ 2 কাজ করে কারণ ইউটিএফ 8 বৈধ ইউটিএফ 8 নয় এমন কোডডে বেশিরভাগ নন ASCII ক্রম রয়েছে।


এটি আরও সঠিক উত্তর বলে মনে হচ্ছে, অন্য উত্তরটি আমার পক্ষে কাজ করে না। ফাইলের সাহায্যে কেউ এটি করতে পারে।অপেনআরেড এবং ফাইলের প্রথম কয়েকটি বাইট পড়ুন।
ব্যবহারকারী420667

1
পদক্ষেপ 2 বিট নিদর্শনগুলি পরীক্ষা করার জন্য প্রোগ্রামিংয়ের পুরো গোছা।
নায়ারগডস

1
আমি নিশ্চিত নই যে ডিকোডিং আসলে ব্যতিক্রম ছুঁড়ে ফেলেছে, বা যদি এটি কেবল '?' এর সাথে অপরিবর্তিত ক্রমগুলি প্রতিস্থাপন করে। আমি যাই হোক না কেন, একটি বিট প্যাটার্ন চেকিং ক্লাস লিখতে গিয়েছিলাম।
নাইয়ারগডস

3
আপনি যখন একটি উদাহরণ তৈরি করেন Utf8Encodingআপনি একটি অতিরিক্ত প্যারামিটারে পাস করতে পারেন যা নির্ধারণ করে যে কোনও ব্যতিক্রম ছোঁড়া উচিত কিনা বা আপনি নীরব ডেটা দুর্নীতি পছন্দ করেন।
কোডসইনচওস

1
আমি এই উত্তর পছন্দ। বেশিরভাগ এনকোডিং (সম্ভবত আপনার ব্যবহারের 99% ক্ষেত্রে) ইউটিএফ -8 বা এএনএসআই (উইন্ডোজ কোডেপজ 1252) হবে। এনকডিং ব্যর্থ হয়েছে কিনা তা নির্ধারণ করতে স্ট্রিংটিতে প্রতিস্থাপনের অক্ষর (0xFFFD) রয়েছে কিনা তা আপনি পরীক্ষা করতে পারেন।
মার্জ

10

এটা যাচাই কর.

উডে

এটি মজিলা ইউনিভার্সাল চরসেট ডিটেক্টরটির একটি বন্দর এবং আপনি এটি এর মতো ব্যবহার করতে পারেন ...

public static void Main(String[] args)
{
    string filename = args[0];
    using (FileStream fs = File.OpenRead(filename)) {
        Ude.CharsetDetector cdet = new Ude.CharsetDetector();
        cdet.Feed(fs);
        cdet.DataEnd();
        if (cdet.Charset != null) {
            Console.WriteLine("Charset: {0}, confidence: {1}", 
                 cdet.Charset, cdet.Confidence);
        } else {
            Console.WriteLine("Detection failed.");
        }
    }
}

আপনার জানা উচিত যে ইউডিই জিপিএল
lindexi

ঠিক আছে যদি আপনি লাইসেন্স সম্পর্কে চিন্তিত হন তবে আপনি এটি ব্যবহার করতে পারেন। এমআইটি হিসাবে লাইসেন্স পেয়েছে এবং আপনি এটি ওপেন সোর্স এবং ক্লোজড সোর্স সফ্টওয়্যার উভয়ের জন্য ব্যবহার করতে পারেন। nuget.org/packages/SimleHelpers.FileEncoding
Alexei Agüero Alba

লাইসেন্সটি জিপিএল বিকল্প সহ এমপিএল। The library is subject to the Mozilla Public License Version 1.1 (the "License"). Alternatively, it may be used under the terms of either the GNU General Public License Version 2 or later (the "GPL"), or the GNU Lesser General Public License Version 2.1 or later (the "LGPL").
jbtule

এটি প্রদর্শিত হয় যে এই কাঁটাচামান বর্তমানে সর্বাধিক সক্রিয় এবং একটি ন্যুগেট প্যাকেজ ইউডিই.নেটস স্ট্যান্ডার্ড রয়েছে। github.com/yinyue200/ude
jbtule

খুব দরকারী লাইব্রেরি, প্রচুর এবং অস্বাভাবিক এনকোডিং সহ ক্যাপড! ট্যাঙ্ক!
মিশাকুরভ

6

@ কোডসইনচাউস প্রস্তাবিত পদক্ষেপগুলির জন্য বাস্তবায়নের বিশদ সরবরাহ করছে:

1) কোনও বাইট অর্ডার চিহ্ন আছে কিনা তা পরীক্ষা করে দেখুন

2) ফাইলটি বৈধ UTF8 কিনা তা পরীক্ষা করে দেখুন

3) স্থানীয় "এএনএসআই" কোডপেজ ব্যবহার করুন (মাইক্রোসফ্ট এটি সংজ্ঞায়িত করে এএনএসআই)

পদক্ষেপ 2 কাজ করে কারণ ইউটিএফ 8 বৈধ ইউটিএফ 8 নয় এমন কোডডে বেশিরভাগ নন ASCII ক্রম রয়েছে। https://stackoverflow.com/a/4522251/867248 কৌশলটি আরও বিশদে ব্যাখ্যা করে।

using System; using System.IO; using System.Text;

// Using encoding from BOM or UTF8 if no BOM found,
// check if the file is valid, by reading all lines
// If decoding fails, use the local "ANSI" codepage

public string DetectFileEncoding(Stream fileStream)
{
    var Utf8EncodingVerifier = Encoding.GetEncoding("utf-8", new EncoderExceptionFallback(), new DecoderExceptionFallback());
    using (var reader = new StreamReader(fileStream, Utf8EncodingVerifier,
           detectEncodingFromByteOrderMarks: true, leaveOpen: true, bufferSize: 1024))
    {
        string detectedEncoding;
        try
        {
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
            }
            detectedEncoding = reader.CurrentEncoding.BodyName;
        }
        catch (Exception e)
        {
            // Failed to decode the file using the BOM/UT8. 
            // Assume it's local ANSI
            detectedEncoding = "ISO-8859-1";
        }
        // Rewind the stream
        fileStream.Seek(0, SeekOrigin.Begin);
        return detectedEncoding;
   }
}


[Test]
public void Test1()
{
    Stream fs = File.OpenRead(@".\TestData\TextFile_ansi.csv");
    var detectedEncoding = DetectFileEncoding(fs);

    using (var reader = new StreamReader(fs, Encoding.GetEncoding(detectedEncoding)))
    {
       // Consume your file
        var line = reader.ReadLine();
        ...

ধন্যবাদ! এটা আমার জন্য সমাধান। তবে আমি তার reader.Peek() পরিবর্তে ব্যবহার পছন্দ করবো while (!reader.EndOfStream) { var line = reader.ReadLine(); }
হ্যারিসন সিলভা

reader.Peek()পুরো স্ট্রিমটি পড়ে না। আমি দেখতে পেয়েছি যে বড় স্রোতের সাথে Peek()অপর্যাপ্ত ছিল। আমি reader.ReadToEndAsync()পরিবর্তে ব্যবহার ।
গ্যারি পেন্ডলবারি

এবং ইউটিএফ 8 এনকোডিং ভেরিফায়ার কী?
পিটার মুর 14

1
@ পিটারমুর এটি ইউটিএফ ৮-এর জন্য একটি এনকোডিং, লাইনটি পড়ার সময় var Utf8EncodingVerifier = Encoding.GetEncoding("utf-8", new EncoderExceptionFallback(), new DecoderExceptionFallback());এটি tryব্লকে ব্যবহৃত হয় । যদি এনকোডারটি প্রদত্ত পাঠটিকে পার্স করতে ব্যর্থ হয় (পাঠ্যটি utf8 দিয়ে এনকোড করা হয়নি), ইউটিএফ 8 এনকোডিংভিরিফায়ার নিক্ষেপ করবে। ব্যতিক্রমটি ধরা পড়েছে এবং আমরা তখন জানতে পারি যে পাঠ্যটি utf8 নয়, এবং আইএসও -8859-1-এ ডিফল্ট রয়েছে
বার্থিয়ার লেমিয়াক্স

2

নিম্নলিখিত কোডগুলি আমার সিএসপি বা এইচ বা এমএল ফাইলগুলি বিওএম ছাড়াই আইএসও -8859-1 (ল্যাটিন -1) বা ইউটিএফ -8 দিয়ে এনকোডিং করছে কিনা তা নির্ধারণ করার জন্য আমার পাওয়ারশেল কোডগুলি হ'ল যদি না হয় তবে এটি জিবি 18030 বলে মনে হয়। আমি ফ্রান্সে কর্মরত একটি চাইনিজ এবং এমএসভিসি ফরাসি কম্পিউটারে লাতিন -১ হিসাবে সংরক্ষণ করি এবং চীনা কম্পিউটারে জিবি হিসাবে সংরক্ষণ করি যাতে আমার সিস্টেম এবং আমার সহকর্মীদের মধ্যে সোর্স ফাইল এক্সচেঞ্জ করার সময় এটি এনকোডিংয়ের সমস্যা এড়াতে আমাকে সহায়তা করে।

উপায়টি সহজ, যদি সমস্ত অক্ষর x00-x7E, ASCII, UTF-8 এবং লাতিন -1 এর মধ্যে থাকে তবে সমস্ত একই হয় তবে আমি যদি ইউটিএফ -8 দ্বারা একটি নন ASCII ফাইলটি পড়ে থাকি তবে আমরা বিশেষ অক্ষরটি দেখতে পাব , তাই ল্যাটিন -১ দিয়ে পড়ার চেষ্টা করুন। লাতিন -১ এ, \ x7F এবং \ xAF এর মধ্যে ফাঁকা রয়েছে, যখন জিবি x00-xFF এর মধ্যে পূর্ণ ব্যবহার করে তাই যদি আমি দুজনের মধ্যে কোনও পেয়ে যাই, এটি ল্যাটিন -1 নয়

কোডটি পাওয়ারশেলে লেখা আছে, তবে। নেট ব্যবহার করে তাই সি # বা এফ # তে অনুবাদ করা সহজ uses

$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False)
foreach($i in Get-ChildItem .\ -Recurse -include *.cpp,*.h, *.ml) {
    $openUTF = New-Object System.IO.StreamReader -ArgumentList ($i, [Text.Encoding]::UTF8)
    $contentUTF = $openUTF.ReadToEnd()
    [regex]$regex = '�'
    $c=$regex.Matches($contentUTF).count
    $openUTF.Close()
    if ($c -ne 0) {
        $openLatin1 = New-Object System.IO.StreamReader -ArgumentList ($i, [Text.Encoding]::GetEncoding('ISO-8859-1'))
        $contentLatin1 = $openLatin1.ReadToEnd()
        $openLatin1.Close()
        [regex]$regex = '[\x7F-\xAF]'
        $c=$regex.Matches($contentLatin1).count
        if ($c -eq 0) {
            [System.IO.File]::WriteAllLines($i, $contentLatin1, $Utf8NoBomEncoding)
            $i.FullName
        } 
        else {
            $openGB = New-Object System.IO.StreamReader -ArgumentList ($i, [Text.Encoding]::GetEncoding('GB18030'))
            $contentGB = $openGB.ReadToEnd()
            $openGB.Close()
            [System.IO.File]::WriteAllLines($i, $contentGB, $Utf8NoBomEncoding)
            $i.FullName
        }
    }
}
Write-Host -NoNewLine 'Press any key to continue...';
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');

2

.NET খুব সহায়ক নয়, তবে আপনি নিম্নলিখিত অ্যালগরিদম চেষ্টা করতে পারেন:

  1. বিওএম (বাইট অর্ডার চিহ্ন) দ্বারা এনকোডিংটি সন্ধান করার চেষ্টা করুন ... সম্ভবত খুঁজে পাওয়া যাবে না
  2. বিভিন্ন এনকোডিংগুলিতে পার্স করার চেষ্টা করুন

কলটি এখানে:

var encoding = FileHelper.GetEncoding(filePath);
if (encoding == null)
    throw new Exception("The file encoding is not supported. Please choose one of the following encodings: UTF8/UTF7/iso-8859-1");

কোডটি এখানে:

public class FileHelper
{
    /// <summary>
    /// Determines a text file's encoding by analyzing its byte order mark (BOM) and if not found try parsing into diferent encodings       
    /// Defaults to UTF8 when detection of the text file's endianness fails.
    /// </summary>
    /// <param name="filename">The text file to analyze.</param>
    /// <returns>The detected encoding or null.</returns>
    public static Encoding GetEncoding(string filename)
    {
        var encodingByBOM = GetEncodingByBOM(filename);
        if (encodingByBOM != null)
            return encodingByBOM;

        // BOM not found :(, so try to parse characters into several encodings
        var encodingByParsingUTF8 = GetEncodingByParsing(filename, Encoding.UTF8);
        if (encodingByParsingUTF8 != null)
            return encodingByParsingUTF8;

        var encodingByParsingLatin1 = GetEncodingByParsing(filename, Encoding.GetEncoding("iso-8859-1"));
        if (encodingByParsingLatin1 != null)
            return encodingByParsingLatin1;

        var encodingByParsingUTF7 = GetEncodingByParsing(filename, Encoding.UTF7);
        if (encodingByParsingUTF7 != null)
            return encodingByParsingUTF7;

        return null;   // no encoding found
    }

    /// <summary>
    /// Determines a text file's encoding by analyzing its byte order mark (BOM)  
    /// </summary>
    /// <param name="filename">The text file to analyze.</param>
    /// <returns>The detected encoding.</returns>
    private static Encoding GetEncodingByBOM(string filename)
    {
        // Read the BOM
        var byteOrderMark = new byte[4];
        using (var file = new FileStream(filename, FileMode.Open, FileAccess.Read))
        {
            file.Read(byteOrderMark, 0, 4);
        }

        // Analyze the BOM
        if (byteOrderMark[0] == 0x2b && byteOrderMark[1] == 0x2f && byteOrderMark[2] == 0x76) return Encoding.UTF7;
        if (byteOrderMark[0] == 0xef && byteOrderMark[1] == 0xbb && byteOrderMark[2] == 0xbf) return Encoding.UTF8;
        if (byteOrderMark[0] == 0xff && byteOrderMark[1] == 0xfe) return Encoding.Unicode; //UTF-16LE
        if (byteOrderMark[0] == 0xfe && byteOrderMark[1] == 0xff) return Encoding.BigEndianUnicode; //UTF-16BE
        if (byteOrderMark[0] == 0 && byteOrderMark[1] == 0 && byteOrderMark[2] == 0xfe && byteOrderMark[3] == 0xff) return Encoding.UTF32;

        return null;    // no BOM found
    }

    private static Encoding GetEncodingByParsing(string filename, Encoding encoding)
    {            
        var encodingVerifier = Encoding.GetEncoding(encoding.BodyName, new EncoderExceptionFallback(), new DecoderExceptionFallback());

        try
        {
            using (var textReader = new StreamReader(filename, encodingVerifier, detectEncodingFromByteOrderMarks: true))
            {
                while (!textReader.EndOfStream)
                {                        
                    textReader.ReadLine();   // in order to increment the stream position
                }

                // all text parsed ok
                return textReader.CurrentEncoding;
            }
        }
        catch (Exception ex) { }

        return null;    // 
    }
}

1

সি # এর জন্য এখানে দেখুন

https://msdn.microsoft.com/en-us/library/system.io.streamreader.currentencoding%28v=vs.110%29.aspx

string path = @"path\to\your\file.ext";

using (StreamReader sr = new StreamReader(path, true))
{
    while (sr.Peek() >= 0)
    {
        Console.Write((char)sr.Read());
    }

    //Test for the encoding after reading, or at least
    //after the first read.
    Console.WriteLine("The encoding used was {0}.", sr.CurrentEncoding);
    Console.ReadLine();
    Console.WriteLine();
}

0

এটি দরকারী হতে পারে

string path = @"address/to/the/file.extension";

using (StreamReader sr = new StreamReader(path))
{ 
    Console.WriteLine(sr.CurrentEncoding);                        
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.