বাইট অর্ডার মার্ক (বিওএম) ছাড়াই পাঠ্য ফাইল লিখবেন?


116

আমি বিওএম ছাড়াই ইউটিএফ 8 এনকোডিং সহ ভিবি.নেট ব্যবহার করে একটি পাঠ্য ফাইল তৈরি করার চেষ্টা করছি। কেউ আমাকে সাহায্য করতে পারেন, এটি কীভাবে করবেন?
আমি ইউটিএফ 8 এনকোডিং দিয়ে ফাইল লিখতে পারি তবে, কীভাবে এটি থেকে বাইট অর্ডার মার্ক সরানো যায়?

edit1: আমি কোডটি এরকম চেষ্টা করেছি;

    Dim utf8 As New UTF8Encoding()
    Dim utf8EmitBOM As New UTF8Encoding(True)
    Dim strW As New StreamWriter("c:\temp\bom\1.html", True, utf8EmitBOM)
    strW.Write(utf8EmitBOM.GetPreamble())
    strW.WriteLine("hi there")
    strW.Close()

        Dim strw2 As New StreamWriter("c:\temp\bom\2.html", True, utf8)
        strw2.Write(utf8.GetPreamble())
        strw2.WriteLine("hi there")
        strw2.Close()

1.html কেবলমাত্র ইউটিএফ 8 এনকোডিং দিয়ে তৈরি হবে এবং ২.এইচটিএমএল এএনএসআই এনকোডিং বিন্যাসের সাহায্যে তৈরি হবে created

সরলীকৃত পদ্ধতির - http://whatilearnttuday.blogspot.com/2011/10/writ-text-files-without-byte-order.html


8
আপনি যদি কোনও বিওএম না চান তবে আপনি কেন গেটপ্রিম্বল () লিখছেন?
হান্স প্যাস্যান্ট

উত্তর:


200

বাইট অর্ডার চিহ্ন (বিওএম) বাদ দিতে, আপনার স্ট্রিমটিতে অবশ্যই (যা একটি বিওএম তৈরির জন্য কনফিগার করা আছে) UTF8Encodingব্যতীত অন্য কোনও উদাহরণ ব্যবহার করতে হবে System.Text.Encoding.UTF8। এটি করার দুটি সহজ উপায় রয়েছে:

1. সুস্পষ্টভাবে একটি উপযুক্ত এনকোডিং নির্দিষ্ট করে:

  1. ফোন করুন UTF8Encodingকন্সট্রাকটর সঙ্গে Falseজন্য encoderShouldEmitUTF8Identifierপ্যারামিটার।

  2. UTF8Encodingস্ট্রিম নির্মাণকারীর কাছে উদাহরণটি পাস করুন ।

' VB.NET:
Dim utf8WithoutBom As New System.Text.UTF8Encoding(False)
Using sink As New StreamWriter("Foobar.txt", False, utf8WithoutBom)
    sink.WriteLine("...")
End Using
// C#:
var utf8WithoutBom = new System.Text.UTF8Encoding(false);
using (var sink = new StreamWriter("Foobar.txt", false, utf8WithoutBom))
{
    sink.WriteLine("...");
}

2. ডিফল্ট এনকোডিং ব্যবহার:

আপনি একটি সরবরাহ না করেন তাহলে Encodingথেকে StreamWriterএ সব এর কন্সট্রাকটর, StreamWriterডিফল্ট ব্যবহার করুন BOM ছাড়া একটি UTF8 এনকোডিং, দ্বারা তা নিম্নলিখিত ঠিক যেমন ভাল কাজ করা উচিত হবে:

' VB.NET:
Using sink As New StreamWriter("Foobar.txt")
    sink.WriteLine("...")
End Using
// C#:
using (var sink = new StreamWriter("Foobar.txt"))
{
    sink.WriteLine("...");
}

পরিশেষে, নোট করুন যে বিওএম বাদ দেওয়া কেবলমাত্র ইউটিএফ -8 এর জন্য অনুমোদিত, ইউটিএফ -16 এর জন্য নয়।


সর্বদা বুদ্ধিমান নয়: উদাহরণস্বরূপ My.Computer.FileSystem.WriteAllTextBOM লিখেছেন যদি কোনও এনকোডিং নির্দিষ্ট না করা থাকে।
beppe9000

My.Computer.FileSystem.WriteAllTextএক্ষেত্রে ব্যতিক্রম, সম্ভবত পিছনের দিকে ভিবি সামঞ্জস্যের অনুমান করা? File.WriteAllTextUFT8NoBOM এ ডিফল্ট।
jnm2

28

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

Encoding outputEnc = new UTF8Encoding(false); // create encoding with no BOM
TextWriter file = new StreamWriter(filePath, false, outputEnc); // open file with encoding
// write data here
file.Close(); // save and close it

6

কেবল WriteAllTextথেকে পদ্ধতিটি ব্যবহার করুন System.IO.File

দয়া করে ফাইলটি থেকে লেখুন W রাইটআলটেক্সট

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


আমার নেমস্পেসের
একজনটি

4

আকর্ষণীয় দ্রষ্টব্য এটি সম্পর্কে শ্রদ্ধার সাথে: আশ্চর্যরূপে, সিস্টেমের স্থির "ক্রিয়েটেক্সট ()" পদ্ধতি.আইও.ফাইলে শ্রেণিটি বিওএম ছাড়াই ইউটিএফ -8 ফাইল তৈরি করে ।

সাধারণভাবে এটি বাগের উত্স তবে আপনার ক্ষেত্রে এটি সবচেয়ে সহজ কাজ হতে পারে :)


4

যদি আপনি Encodingকোনও নতুন StreamWriterনির্দিষ্ট ডিফল্ট Encodingঅবজেক্ট তৈরি করার সময় নির্দিষ্ট না করেন UTF-8 No BOMযা এর মাধ্যমে তৈরি হয় new UTF8Encoding(false, true)

সুতরাং কনস্ট্রাক্টরগুলির বিওএম ব্যবহার না করে একটি পাঠ্য ফাইল তৈরি করতে আপনার কোনও এনকোডিং সরবরাহ করার প্রয়োজন নেই:

new StreamWriter(Stream)
new StreamWriter(String)
new StreamWriter(String, Boolean)

আমার যদি নির্দিষ্ট করার দরকার হয় leaveOpen?
বিনকি

@ বিঙ্কি সেক্ষেত্রে আপনি ডিফল্ট এনকোডিং ব্যবহার করতে পারবেন না StreamWriter। আপনাকে new UTF8Encoding(false, true)আপনার এনকোডিংটি নির্দিষ্ট করতে leaveOpenএবং বিওএম না রাখার জন্য নির্দিষ্ট করতে হবে ।
এসডিতে জেজি

3

আমি মনে করি রোমান নিকিতিন ঠিক আছে। কনস্ট্রাক্টর আর্গুমেন্টটির অর্থ উল্টানো হয়। মিথ্যা মানে কোনও বিওএম এবং সত্যিকারের অর্থ বিওএম সহ নয়।

আপনি একটি এএনএসআই এনকোডিং পেয়েছেন কারণ কোনও বিওএম ছাড়াই একটি ফাইল যাতে আনসিসি-র অক্ষর না থাকে এমন একটি এএনএসআই ফাইলের মতোই। আপনার "হাই হাই" স্ট্রিংয়ের কয়েকটি বিশেষ অক্ষর ব্যবহার করে দেখুন এবং আপনাকে এএনএসআই এনকোডিং-বিওএম ছাড়াই দেখতে পাবেন।


1

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

এক্সএমএল এনকোডিংয়ের জন্য কোডের একটি সি # স্নিপেট এখানে রয়েছে:

    Encoding utf8noBOM = new UTF8Encoding(false);  
    XmlWriterSettings settings = new XmlWriterSettings();  
    settings.Encoding = utf8noBOM;  
          
    using (XmlWriter xw = XmlWriter.Create(filePath, settings))  
    {  
        xDoc.WriteTo(xw);  
        xw.Flush();  
    }    

এটি প্রকৃতপক্ষে আউটপুট ফাইল থেকে তিনটি শীর্ষস্থানীয় চরিত্রকে সরিয়ে দেয় কিনা তা ভ্রান্ত হতে পারে। উদাহরণস্বরূপ, আপনি যদি নোটপ্যাড ++ (www.notepad-plus-plus.org) ব্যবহার করেন তবে এটি "এএনএসআই-তে এনকোড" প্রতিবেদন করবে। আমার ধারণা, বেশিরভাগ পাঠ্য সম্পাদকরা ইউটিএফ -8 কিনা তা জানানোর জন্য বিওএম অক্ষর গণনা করছেন। এটি পরিষ্কারভাবে দেখার উপায়টি হ'ল উইনহেক্স (www.winhex.com) এর মতো বাইনারি সরঞ্জাম সহ । যেহেতু আমি পার্থক্য করার আগে এবং পরে খুঁজছিলাম আমি মাইক্রোসফ্ট উইনডিফ অ্যাপ্লিকেশনটি ব্যবহার করেছি ।


-1

এটি হতে পারে যে আপনার ইনপুট পাঠ্যে একটি বাইট অর্ডার চিহ্ন রয়েছে। সেক্ষেত্রে লেখার আগে আপনার এটি অপসারণ করা উচিত।


1
আমাকে সাহায্য করুন। লেখার আগে কীভাবে এটি সরিয়ে ফেলা যায়।
বিজয় বলকাওয়াদে

@ ব্যবহারকারী180326 ডিফল্ট পাঠক আপনার জন্য ইতিমধ্যে ফিল্টার করে না?
বিনকি

-1
Dim sWriter As IO.StreamWriter = New IO.StreamWriter(shareworklist & "\" & getfilename() & ".txt", False, Encoding.Default)

আপনি চান হিসাবে আপনাকে ফলাফল দেয় (আমি মনে করি)।


1
আমার পিসিতে এটি এএনএসআই ফাইল তৈরি করে
মুফ্লিক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.