Cmd.exe কোন এনকোডিং / কোড পৃষ্ঠাটি ব্যবহার করছে?


271

আমি যখন উইন্ডোজে cmd.exe খুলি, এটি কোন এনকোডিংটি ব্যবহার করছে?

এটি বর্তমানে কোন এনকোডিংটি ব্যবহার করছে তা আমি কীভাবে পরীক্ষা করতে পারি? এটি কি আমার আঞ্চলিক সেটিংয়ের উপর নির্ভর করে বা চেক করার জন্য কোনও পরিবেশের ভেরিয়েবল রয়েছে?

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

উত্তর:


389

হ্যাঁ, এটি হতাশ — কখনও কখনও typeএবং অন্যান্য প্রোগ্রামগুলি জিব্রিশ ছাপায় এবং কখনও কখনও তা করে না।

প্রথমত, ইউনিকোডের অক্ষরগুলি কেবল তখনই প্রদর্শিত হবে যদি বর্তমান কনসোল ফন্টে অক্ষর থাকে । সুতরাং ডিফল্ট রাস্টার ফন্টের পরিবর্তে লুসিডা কনসোলের মতো একটি ট্রু টাইপ ফন্ট ব্যবহার করুন।

তবে কনসোল ফন্টে আপনি যে অক্ষরটি প্রদর্শন করার চেষ্টা করছেন তা না থাকলে আপনি জিব্বারিশের পরিবর্তে প্রশ্ন চিহ্ন দেখতে পাবেন। আপনি যখন জিবিরশ হন, কেবল ফন্টের সেটিংসের চেয়ে আরও বেশি কিছু চলছে।

প্রোগ্রামগুলি যেমন স্ট্যান্ডার্ড সি-লাইব্রেরি I / O ফাংশনগুলি ব্যবহার করে printf, প্রোগ্রামটির আউটপুট এনকোডিং অবশ্যই কনসোলের আউটপুট এনকোডিংয়ের সাথে মেলে , বা আপনি জিব্বারিশ পাবেন। chcpবর্তমান কোডকেজ দেখায় এবং সেট করে। স্ট্যান্ডার্ড সি-লাইব্রেরি I / O ফাংশনগুলি ব্যবহার করে সমস্ত আউটপুট এমনভাবে আচরণ করা হয় যেন এটি প্রদর্শিত কোডকবেজে থাকে chcp

কনসোলের আউটপুট এনকোডিংয়ের সাথে প্রোগ্রামটির আউটপুট এনকোডিংটি মিলিয়ে দুটি ভিন্ন উপায়ে সম্পন্ন করা যেতে পারে:

  • কোনও প্রোগ্রাম কনসোলের বর্তমান কোডপেজ ব্যবহার করে chcpবা এটি ব্যবহার করে GetConsoleOutputCPএবং সেটিকে এনকোডিংয়ে আউটপুটে কনফিগার করতে পারে, বা

  • আপনি বা কোনও প্রোগ্রাম প্রোগ্রামটির ডিফল্ট আউটপুট এনকোডিং ব্যবহার করে chcpবা কনসোলের বর্তমান কোডপেজ সেট করতে পারে setSetConsoleOutputCP

যাইহোক, উইন 32 এপিআই ব্যবহার করে এমন প্রোগ্রামগুলি ইউটিএফ-16LE স্ট্রিংগুলি সরাসরি কনসোলে লিখতে পারে WriteConsoleW। কোডপেজ সেট না করে সঠিক আউটপুট পাওয়ার একমাত্র উপায় এটি। এমনকি সেই ফাংশনটি ব্যবহার করার সময়ও, যদি কোনও স্ট্রিংটি শুরু করতে UTF-16LE এনকোডিংয়ে না থাকে, একটি উইন 32 প্রোগ্রামে অবশ্যই সঠিক কোডপেজটি পাস করতে হবে MultiByteToWideChar। এছাড়াও, WriteConsoleWযদি প্রোগ্রামটির আউটপুট পুনঃনির্দেশিত হয় তবে কাজ করবে না; সেক্ষেত্রে আরও ফিডিং দরকার।

typeকিছু সময় কাজ করে কারণ এটি ইউটিএফ -16 এল বাইট অর্ডার মার্ক (বিওএম) , অর্থাৎ বাইটগুলির জন্য প্রতিটি ফাইলের সূচনা পরীক্ষা করে 0xFF 0xFE। যদি এটি কোনও চিহ্ন খুঁজে পায় তবে এটি WriteConsoleW বর্তমান কোডপেজ নির্বিশেষে ফাইলটিতে ইউনিকোড অক্ষর প্রদর্শন করে । তবে typeকোনও ইউটিএফ -১ B এলএইএম বিএম ছাড়াই কোনও ফাইল যখন ইনগ করার সময় বা অ্যাস্কিআই অক্ষর ব্যবহার না করে যে কোনও কমান্ড ব্যবহার করে না - WriteConsoleWআপনাকে একে অপরের সাথে মেলে যাওয়ার জন্য কনসোল কোডপেজ এবং প্রোগ্রাম আউটপুট এনকোডিং সেট করতে হবে।


আমরা কীভাবে এটি খুঁজে পেতে পারি?

ইউনিকোড অক্ষর সমন্বিত একটি পরীক্ষা ফাইল এখানে:

ASCII     abcde xyz
German    äöü ÄÖÜ ß
Polish    ąęźżńł
Russian   абвгдеж эюя
CJK       你好

বিভিন্ন ইউনিকোড এনকোডিংগুলির একটি গোছায় পরীক্ষার ফাইলটি মুদ্রণের জন্য এখানে একটি জাভা প্রোগ্রাম রয়েছে। এটি যে কোনও প্রোগ্রামিং ভাষায় হতে পারে; এটি কেবলমাত্র ASCII টি অক্ষর বা এনকোডড বাইট প্রিন্ট করে stdout

import java.io.*;

public class Foo {

    private static final String BOM = "\ufeff";
    private static final String TEST_STRING
        = "ASCII     abcde xyz\n"
        + "German    äöü ÄÖÜ ß\n"
        + "Polish    ąęźżńł\n"
        + "Russian   абвгдеж эюя\n"
        + "CJK       你好\n";

    public static void main(String[] args)
        throws Exception
    {
        String[] encodings = new String[] {
            "UTF-8", "UTF-16LE", "UTF-16BE", "UTF-32LE", "UTF-32BE" };

        for (String encoding: encodings) {
            System.out.println("== " + encoding);

            for (boolean writeBom: new Boolean[] {false, true}) {
                System.out.println(writeBom ? "= bom" : "= no bom");

                String output = (writeBom ? BOM : "") + TEST_STRING;
                byte[] bytes = output.getBytes(encoding);
                System.out.write(bytes);
                FileOutputStream out = new FileOutputStream("uc-test-"
                    + encoding + (writeBom ? "-bom.txt" : "-nobom.txt"));
                out.write(bytes);
                out.close();
            }
        }
    }
}

ডিফল্ট কোডপেজ আউটপুট? মোট আবর্জনা!

Z:\andrew\projects\sx\1259084>chcp
Active code page: 850

Z:\andrew\projects\sx\1259084>java Foo
== UTF-8
= no bom
ASCII     abcde xyz
German    ├ñ├Â├╝ ├ä├û├£ ├ƒ
Polish    ąęźżńł
Russian   ð░ð▒ð▓ð│ð┤ðÁð ÐìÐÄÐÅ
CJK       õ¢áÕÑ¢
= bom
´╗┐ASCII     abcde xyz
German    ├ñ├Â├╝ ├ä├û├£ ├ƒ
Polish    ąęźżńł
Russian   ð░ð▒ð▓ð│ð┤ðÁð ÐìÐÄÐÅ
CJK       õ¢áÕÑ¢
== UTF-16LE
= no bom
A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h         ♣☺↓☺z☺|☺D☺B☺
 R u s s i a n       0♦1♦2♦3♦4♦5♦6♦  M♦N♦O♦
 C J K               `O}Y
 = bom
 ■A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h         ♣☺↓☺z☺|☺D☺B☺
 R u s s i a n       0♦1♦2♦3♦4♦5♦6♦  M♦N♦O♦
 C J K               `O}Y
 == UTF-16BE
= no bom
 A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h        ☺♣☺↓☺z☺|☺D☺B
 R u s s i a n      ♦0♦1♦2♦3♦4♦5♦6  ♦M♦N♦O
 C J K              O`Y}
= bom
■  A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h        ☺♣☺↓☺z☺|☺D☺B
 R u s s i a n      ♦0♦1♦2♦3♦4♦5♦6  ♦M♦N♦O
 C J K              O`Y}
== UTF-32LE
= no bom
A   S   C   I   I                       a   b   c   d   e       x   y   z
   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                   ♣☺  ↓☺  z☺  |☺  D☺  B☺
   R   u   s   s   i   a   n               0♦  1♦  2♦  3♦  4♦  5♦  6♦      M♦  N
♦  O♦
   C   J   K                               `O  }Y
   = bom
 ■  A   S   C   I   I                       a   b   c   d   e       x   y   z

   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                   ♣☺  ↓☺  z☺  |☺  D☺  B☺
   R   u   s   s   i   a   n               0♦  1♦  2♦  3♦  4♦  5♦  6♦      M♦  N
♦  O♦
   C   J   K                               `O  }Y
   == UTF-32BE
= no bom
   A   S   C   I   I                       a   b   c   d   e       x   y   z
   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                  ☺♣  ☺↓  ☺z  ☺|  ☺D  ☺B
   R   u   s   s   i   a   n              ♦0  ♦1  ♦2  ♦3  ♦4  ♦5  ♦6      ♦M  ♦N
  ♦O
   C   J   K                              O`  Y}
= bom
  ■    A   S   C   I   I                       a   b   c   d   e       x   y   z

   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                  ☺♣  ☺↓  ☺z  ☺|  ☺D  ☺B
   R   u   s   s   i   a   n              ♦0  ♦1  ♦2  ♦3  ♦4  ♦5  ♦6      ♦M  ♦N
  ♦O
   C   J   K                              O`  Y}

যাইহোক, যদি আমরা typeসেই ফাইলগুলি সংরক্ষণ করি তবে? এগুলিতে ঠিক একই বাইট রয়েছে যা কনসোলে মুদ্রিত হয়েছিল।

Z:\andrew\projects\sx\1259084>type *.txt

uc-test-UTF-16BE-bom.txt


■  A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h        ☺♣☺↓☺z☺|☺D☺B
 R u s s i a n      ♦0♦1♦2♦3♦4♦5♦6  ♦M♦N♦O
 C J K              O`Y}

uc-test-UTF-16BE-nobom.txt


 A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h        ☺♣☺↓☺z☺|☺D☺B
 R u s s i a n      ♦0♦1♦2♦3♦4♦5♦6  ♦M♦N♦O
 C J K              O`Y}

uc-test-UTF-16LE-bom.txt


ASCII     abcde xyz
German    äöü ÄÖÜ ß
Polish    ąęźżńł
Russian   абвгдеж эюя
CJK       你好

uc-test-UTF-16LE-nobom.txt


A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h         ♣☺↓☺z☺|☺D☺B☺
 R u s s i a n       0♦1♦2♦3♦4♦5♦6♦  M♦N♦O♦
 C J K               `O}Y

uc-test-UTF-32BE-bom.txt


  ■    A   S   C   I   I                       a   b   c   d   e       x   y   z

   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                  ☺♣  ☺↓  ☺z  ☺|  ☺D  ☺B
   R   u   s   s   i   a   n              ♦0  ♦1  ♦2  ♦3  ♦4  ♦5  ♦6      ♦M  ♦N
  ♦O
   C   J   K                              O`  Y}

uc-test-UTF-32BE-nobom.txt


   A   S   C   I   I                       a   b   c   d   e       x   y   z
   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                  ☺♣  ☺↓  ☺z  ☺|  ☺D  ☺B
   R   u   s   s   i   a   n              ♦0  ♦1  ♦2  ♦3  ♦4  ♦5  ♦6      ♦M  ♦N
  ♦O
   C   J   K                              O`  Y}

uc-test-UTF-32LE-bom.txt


 A S C I I           a b c d e   x y z
 G e r m a n         ä ö ü   Ä Ö Ü   ß
 P o l i s h         ą ę ź ż ń ł
 R u s s i a n       а б в г д е ж   э ю я
 C J K               你 好

uc-test-UTF-32LE-nobom.txt


A   S   C   I   I                       a   b   c   d   e       x   y   z
   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                   ♣☺  ↓☺  z☺  |☺  D☺  B☺
   R   u   s   s   i   a   n               0♦  1♦  2♦  3♦  4♦  5♦  6♦      M♦  N
♦  O♦
   C   J   K                               `O  }Y

uc-test-UTF-8-bom.txt


´╗┐ASCII     abcde xyz
German    ├ñ├Â├╝ ├ä├û├£ ├ƒ
Polish    ąęźżńł
Russian   ð░ð▒ð▓ð│ð┤ðÁð ÐìÐÄÐÅ
CJK       õ¢áÕÑ¢

uc-test-UTF-8-nobom.txt


ASCII     abcde xyz
German    ├ñ├Â├╝ ├ä├û├£ ├ƒ
Polish    ąęźżńł
Russian   ð░ð▒ð▓ð│ð┤ðÁð ÐìÐÄÐÅ
CJK       õ¢áÕÑ¢

শুধুমাত্র জিনিস যে কাজ হল UTF-16LE ফাইলটি একটি BOM মাধ্যমে কনসোলে মুদ্রিত সঙ্গে, হয় type

যদি আমরা typeফাইলটি মুদ্রণ করা ব্যতীত অন্য কিছু ব্যবহার করি তবে আমরা আবর্জনা পাই:

Z:\andrew\projects\sx\1259084>copy uc-test-UTF-16LE-bom.txt CON
 ■A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h         ♣☺↓☺z☺|☺D☺B☺
 R u s s i a n       0♦1♦2♦3♦4♦5♦6♦  M♦N♦O♦
 C J K               `O}Y
         1 file(s) copied.

ইউনিকোডটি copy CONসঠিকভাবে প্রদর্শন করে না এমন তথ্য থেকে , আমরা এই সিদ্ধান্তে পৌঁছাতে পারি যে typeফাইলটির শুরুতে একটি কমান্ডের একটি ইউটিএফ-16LE বিওএম সনাক্ত করার জন্য যুক্তি রয়েছে এবং এটি মুদ্রণের জন্য বিশেষ উইন্ডোজ এপিআই ব্যবহার করে।

cmd.exeএটি type কোনও ফাইলের বাইরে যাওয়ার সময় আমরা একটি ডিবাগারে খোলার মাধ্যমে দেখতে পাই :

এখানে চিত্র বর্ণনা লিখুন

typeকোনও ফাইল খোলার পরে এটি আই-এর একটি বিওএম, লিটল-এন্ডিয়ান- 0xFEFFএ বাইটগুলি পরীক্ষা 0xFF 0xFEকরে এবং যদি এরকম কোনও বিওএম থাকে তবে typeএকটি অভ্যন্তরীণ fOutputUnicodeপতাকা সেট করে । কল করতে হবে কিনা তা সিদ্ধান্ত নিতে এই পতাকাটি পরে চেক করা হয়েছে WriteConsoleW

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

আপনি typeনিজের প্রোগ্রামগুলিতে ইউনিকোডকে কীভাবে কনসোলে আউটপুট দেয় তা অনুকরণ করতে পারেন:

#include <stdio.h>
#define UNICODE
#include <windows.h>

static LPCSTR lpcsTest =
    "ASCII     abcde xyz\n"
    "German    äöü ÄÖÜ ß\n"
    "Polish    ąęźżńł\n"
    "Russian   абвгдеж эюя\n"
    "CJK       你好\n";

int main() {
    int n;
    wchar_t buf[1024];

    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    n = MultiByteToWideChar(CP_UTF8, 0,
            lpcsTest, strlen(lpcsTest),
            buf, sizeof(buf));

    WriteConsole(hConsole, buf, n, &n, NULL);

    return 0;
}

এই প্রোগ্রামটি উইন্ডোজ কনসোলে ইউনিকোড মুদ্রণের জন্য ডিফল্ট কোডপেজ ব্যবহার করে কাজ করে।


নমুনা জাভা প্রোগ্রামের জন্য, কোডপেজটি ম্যানুয়ালি সেট করে আমরা কিছুটা সঠিক আউটপুট পেতে পারি, যদিও আউটপুটটি অদ্ভুত উপায়ে গণ্ডগোল হয়ে যায়:

Z:\andrew\projects\sx\1259084>chcp 65001
Active code page: 65001

Z:\andrew\projects\sx\1259084>java Foo
== UTF-8
= no bom
ASCII     abcde xyz
German    äöü ÄÖÜ ß
Polish    ąęźżńł
Russian   абвгдеж эюя
CJK       你好
ж эюя
CJK       你好
 你好
好
�
= bom
ASCII     abcde xyz
German    äöü ÄÖÜ ß
Polish    ąęźżńł
Russian   абвгдеж эюя
CJK       你好
еж эюя
CJK       你好
  你好
好
�
== UTF-16LE
= no bom
A S C I I           a b c d e   x y z
…

তবে, একটি সি প্রোগ্রাম যা একটি ইউনিকোড ইউটিএফ -8 কোডপেজ সেট করে:

#include <stdio.h>
#include <windows.h>

int main() {
    int c, n;
    UINT oldCodePage;
    char buf[1024];

    oldCodePage = GetConsoleOutputCP();
    if (!SetConsoleOutputCP(65001)) {
        printf("error\n");
    }

    freopen("uc-test-UTF-8-nobom.txt", "rb", stdin);
    n = fread(buf, sizeof(buf[0]), sizeof(buf), stdin);
    fwrite(buf, sizeof(buf[0]), n, stdout);

    SetConsoleOutputCP(oldCodePage);

    return 0;
}

সঠিক আউটপুট আছে:

Z:\andrew\projects\sx\1259084>.\test
ASCII     abcde xyz
German    äöü ÄÖÜ ß
Polish    ąęźżńł
Russian   абвгдеж эюя
CJK       你好

গল্পটির সারাংশ হলো?

  • type আপনার বর্তমান কোডপেজ নির্বিশেষে কোনও বিওএম দিয়ে UTF-16LE ফাইল মুদ্রণ করতে পারে
  • উইন 32 প্রোগ্রামগুলি ইউনিকোডকে কনসোলে আউটপুট দেওয়ার জন্য প্রোগ্রামিং করা যেতে পারে WriteConsoleW
  • অন্যান্য প্রোগ্রাম যা কোডপেজ সেট করে এবং ততক্ষণে তাদের আউটপুট এনকোডিং সামঞ্জস্য করে প্রোগ্রাম শুরু হওয়ার পরে কোডপেজটি কী ছিল তা নির্বিশেষে কনসোলটিতে ইউনিকোড প্রিন্ট করতে পারে
  • অন্য সব কিছুর জন্য আপনাকে প্রায় গোলমাল করতে হবে chcpএবং সম্ভবত এখনও অদ্ভুত আউটপুট পাবে।

73
ওহ, আমি অবশ্যই এসও-তে দেখেছি এটির সবচেয়ে বিশদ উত্তর answer বিচ্ছিন্ন প্রিন্ট এবং বহুভাষার দক্ষতার জন্য অতিরিক্ত ক্রেডিট! সবে সুন্দর, স্যার!
এয়ারট্রাইক

2
কেউ VS2008-এ প্রবর্তিত মাইক্রোসফ্ট-নির্দিষ্ট এক্সটেনশন _ সেটমোড (_ফিলেনো (স্টাডআউট), _ ও_ইউ 16 টেক্সট) অধ্যয়ন করতেও চাইতে পারেন। দেখুন stackoverflow.com/a/9051543 এবং stackoverflow.com/a/12015918 এবং msdn.microsoft.com/en-us/library/tw4k6df8(v=vs.90).aspx () _setmode মধ্যে সুস্পষ্ট বহনযোগ্যতা পার্থক্য এছাড়া এবং সেটকনসোলআউটপুটসিপি (), উভয় পদ্ধতির মধ্যে অন্যান্য সূক্ষ্মতা এবং পার্শ্ব-প্রতিক্রিয়া লুকিয়ে থাকতে পারে যা প্রথম নজরে সম্পূর্ণ বোঝা যায় না। অ্যান্ড্রুডটন যদি _setmode (fd, _O_U16TEXT) সম্পর্কে কোনও পর্যবেক্ষণের সাথে তার উত্তরটি আপডেট করতে পারতেন তবে তা দুর্দান্ত would
জেসদেভ

13
যদিও এটি একটি দুর্দান্ত উত্তর, কনসোলটি ইউটিএফ -16 সমর্থন করে তা বলা বিভ্রান্তিকর। এটি ইউসিএস -২ এর মধ্যে সীমাবদ্ধ, অর্থাৎ বেসিক বহুভাষিক বিমান (বিএমপি) এর অক্ষরগুলির মধ্যে সীমাবদ্ধ। যখন উইন 32 কনসোল সার্ভার (conhost.exe, আজকাল) প্রায় 1990 সালে ডিজাইন করা হয়েছিল, ইউনিকোড একটি 16-বিট স্ট্যান্ডার্ড ছিল, তাই কনসোল স্ক্রিন বাফার অক্ষর ঘরে প্রতিটি 16-বিট ডাব্লুসিএইচআর ব্যবহার করে। একটি ইউটিএফ -16 সারোগেট জুটি দুটি বক্সের অক্ষর হিসাবে মুদ্রণ করে।
এরিক সান

3
@ ইউজার ২০০78৮৩, পঁচানো ফর্ম সমর্থিত নয়; সাধারণত একটি এনএফসি সমতুল্যে রূপান্তর করতে পারে। এছাড়াও, পশ্চিমা লোকেলে কনসোল পুরো-প্রস্থ এবং অর্ধ-প্রস্থের গ্লিফগুলিকে মিশ্রিত করতে দেয় না। এছাড়াও, কোডপেজ 65001 (ইউটিএফ -8) ব্যবহার করার সময়, উইন্ডোজ 8 এর পূর্বে WriteFileবাইটের সংখ্যার পরিবর্তে রচিত অক্ষরের সংখ্যা রিপোর্ট করে, তাই বাফার লেখকরা 'অবশিষ্ট' বাইটগুলি অ-ASCII অক্ষরের সংখ্যার অনুপাতে কয়েকবার চেষ্টা করেন । এছাড়াও 65001 সালে, নন-এএসসিআইআই অক্ষরগুলি পড়া কনফস্ট.এক্সে ব্যর্থ হয় কারণ এটি কল করার সময় ইউটিএফ -16 কোড অনুযায়ী 1 এএনএসআই বাইট ধরে নেয় WideCharToMultiByte
এরিক সান

2
এই উত্তরের সাধারণ ডেমো প্রোগ্রামগুলি ধরে নেয় যে GetStdHandle(STD_OUTPUT_HANDLE)এবং সি stdoutকনসোল হ্যান্ডলগুলি। অনুশীলনে, একটি কনসোল পরীক্ষা করার জন্য, এটি GetConsoleModeসফল হয় কিনা তা পরীক্ষা করুন । এছাড়াও, _isattyনিম্ন আই / ও ফাইল বিবরণকারী কনসোল কিনা তা পরীক্ষা করতে সি রানটাইম ফাংশনটি ব্যবহার করবেন না ; এটি কেবল একটি অক্ষর-মোড ডিভাইস যাচাই করে যা NULঅন্যদের মধ্যে অন্তর্ভুক্ত । পরিবর্তে, কল করুন _get_osfhandleএবং সরাসরি হ্যান্ডেলটি পরীক্ষা করুন।
এরিক সান

29

আদর্শ

chcp

আপনার বর্তমান কোড পৃষ্ঠাটি দেখতে (যেমন ডিউফাই ইতিমধ্যে বলেছে)।

ব্যবহার

nlsinfo

সমস্ত ইনস্টলড কোড পৃষ্ঠা দেখতে এবং আপনার কোড পৃষ্ঠা নম্বরটির অর্থ কী তা খুঁজে বের করতে।

আপনি উইন্ডোজ সার্ভার 2003 রিসোর্স কিট ইনস্টল ব্যবহার করবেন (Windows XP তে কাজ) থাকতে হবে nlsinfo


19
মজার ব্যাপার হচ্ছে, nlsinfoআমার উইন্ডোজ 7. অস্তিত্ব বলে মনে হচ্ছে না
জোয়ি

2
nlsinfoআমার উইন্ডোজ এক্সপি এসপি 3 মেশিনেও বিদ্যমান নেই।
থমাস

2
ওহ আমি দুঃখিত. আমি মনে করি এটি উইন্ডোজ সার্ভার রিসোর্স কিট সরঞ্জামগুলির সাথে আসে। আমি এটি আগে আমার উইন্ডোজ এক্সপি এসপি 3 মেশিনে কয়েকবার ব্যবহার করেছি এবং জানি না যে এটি ডিফল্টরূপে ইনস্টল করা হয়নি।
ক্যাগদাস আল্টিনকায়া

আহ, এটি আমার ভিস্তা মেশিনে কেন আছে, যেখানে আমি সেগুলি ইনস্টল করেছি তা ব্যাখ্যা করে।
জোয়

4
nlsinfoউইন্ডোজ 10 ই মেশিনেও বিদ্যমান নেই।
ইউসু আলেয়্যুব

21

আপনার দ্বিতীয় প্রশ্নের উত্তর দিতে। এনকোডিং কীভাবে কাজ করে, জোল স্পলস্কি এ সম্পর্কে একটি দুর্দান্ত প্রারম্ভিক নিবন্ধ লিখেছিলেন । দৃr়ভাবে প্রস্তাবিত।


13
আমি এটি পড়েছি এবং আমি এটি জানি। যাইহোক, উইন্ডোজ আমি সর্বদা হারাতে বোধ করি কারণ ওএস এবং বেশিরভাগ অ্যাপ্লিকেশনগুলি এনকোডিং সম্পর্কে সম্পূর্ণ অজ্ঞ ora
ডাংলুন্ড

5

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


5
সিএইচসিপি না শুধুমাত্র 3 টি সংখ্যা দেখায় বা এটি 8 ## ফর্ম্যাটেও নয়। 437 উদাহরণস্বরূপ একটি মার্কিন এনকোডিং এবং এটি ইংরেজী সিস্টেমে ডিফল্ট মান। - 65001 একটি ইউনিকোড এনকোডিং (যদি আমি এটি সঠিকভাবে স্মরণ করি তবে এটি ইউটিএফ -8 এবং 65000 ইউটিএফ -7) এবং চয়ন করা যেতে পারে। এছাড়াও সিএমডি উদাহরণস্বরূপ 1250 কোড পৃষ্ঠাতে স্যুইচ করতে দেয় তবে এই কোড পৃষ্ঠাটি কখন নির্বাচনযোগ্য তা আমি জানি না। (এটি উইন 7 এর অধীনে))
অ্যাডাম এলএস

4

আমি উইন্ডোজ কোড পৃষ্ঠা সংক্রান্ত সমস্যাগুলি এবং সি প্রোগ্রামের বহনযোগ্যতা এবং স্থানীয়করণের সমস্যাগুলির দ্বারা দীর্ঘকাল হতাশ হয়ে পড়েছি। পূর্ববর্তী পোস্টগুলিতে দৈর্ঘ্যের বিষয়ে বিস্তারিত আলোচনা করা হয়েছে, সুতরাং আমি এই বিষয়ে কিছু যুক্ত করব না।

একটি দীর্ঘ গল্প সংক্ষিপ্ত করতে, অবশেষে আমি ভিসুয়াল সি ++ স্ট্যান্ডার্ড সি লাইব্রেরিতে আমার নিজের ইউটিএফ -8 সামঞ্জস্য লাইব্রেরী স্তরটি লিখে শেষ করেছি। মূলত এই গ্রন্থাগারটি নিশ্চিত করে যে কোনও স্ট্যান্ডার্ড সি প্রোগ্রামটি ইউটিএফ -8 অভ্যন্তরীণভাবে ব্যবহার করে যে কোনও কোড পৃষ্ঠায় সঠিকভাবে কাজ করে।

MsvcLibX নামে পরিচিত এই লাইব্রেরিটি https://github.com/JFLarvoire/SysToolsLib এ ওপেন সোর্স হিসাবে উপলব্ধ । প্রধান বৈশিষ্ট্য:

  • সি সূত্রগুলি ইউটিএফ -8 এ এনকোড করা হয়েছে, সাধারণ চর [] সি স্ট্রিং এবং মান সি লাইব্রেরি এপিআই ব্যবহার করে।
  • যে কোনও কোড পৃষ্ঠাতে, সমস্ত কিছু অভ্যন্তরীণভাবে আপনার কোডের ইউটিএফ -8 হিসাবে প্রসেস করা হয়, মূল () রুটিন আরগভি [] সহ, স্ট্যান্ডার্ড ইনপুট এবং আউটপুট সহ স্বয়ংক্রিয়ভাবে ডান কোড পৃষ্ঠায় রূপান্তরিত হয়।
  • সমস্ত stdio.h ফাইল ফাংশন ইউটিএফ -8 পাথনাম> 260 টি অক্ষর সমর্থন করে, যা আসলে 64 কেবাইট পর্যন্ত।
  • একই উত্সগুলি উইন্ডোজে ভিজ্যুয়াল সি ++ এবং এমএসভিসিএলআইবিএক্স এবং ভিজ্যুয়াল সি ++ সি লাইব্রেরি ব্যবহার করে এবং লিনাক্সে জিসিসি এবং লিনাক্স স্ট্যান্ডার্ড সি লাইব্রেরি ব্যবহার করে, #ifdef ... #endif ব্লকের কোনও প্রয়োজন ছাড়াই সংকলন এবং লিঙ্ক করতে পারে।
  • অ্যাডসগুলিতে লিনাক্সে সাধারণ ফাইল অন্তর্ভুক্ত থাকে তবে ভিজ্যুয়াল সি ++ এ অনুপস্থিত। প্রাক্তন: unistd.h
  • ডিরেক্টরি আই / ও, প্রতীকী লিংক পরিচালনা ইত্যাদির মতো অনুপস্থিত ফাংশন যুক্ত করে: ইউটিএফ -8 সমর্থন সহ অবশ্যই :-)।

গ্রন্থাগারটি কীভাবে তৈরি করবেন এবং এটি কীভাবে আপনার নিজের প্রোগ্রামগুলিতে ব্যবহার করবেন সেগুলি সহ গিটহাবের এমএসভিসিএলবিএক্স রিডমিতে আরও বিশদ ।

মুক্তির অধ্যায় GitHub উপরে সংগ্রহস্থলের মধ্যে এই MsvcLibX গ্রন্থাগার, যে তার ক্ষমতা দেখাবে ব্যবহার করে বেশ কিছু প্রোগ্রাম প্রদান করে। উদাহরণস্বরূপ: PATH- এ ASCII নামবিহীন ডিরেক্টরিগুলির সাথে ডিরেক্টরি সহ আমার who.exe সরঞ্জামটি চেষ্টা করুন, নন-এসসিআইআই নামযুক্ত প্রোগ্রামগুলি অনুসন্ধান এবং কোড পৃষ্ঠাতে পরিবর্তন করুন।

কনভ.এক্সি প্রোগ্রামটি রয়েছে আরও একটি দরকারী সরঞ্জাম। এই প্রোগ্রামটি সহজেই কোনও কোড পৃষ্ঠা থেকে অন্য যে কোনও ডেটা স্ট্রিমকে রূপান্তর করতে পারে। এর ডিফল্টটি উইন্ডোজ কোড পৃষ্ঠাতে ইনপুট এবং বর্তমান কনসোল কোড পৃষ্ঠাতে আউটপুট। এটি একটি সাধারণ কমান্ড সহ একটি কমান্ড কনসোলে উইন্ডোজ জিইউআই অ্যাপস (উদা: নোটপ্যাড) দ্বারা উত্পন্ন ডেটা সঠিকভাবে দেখতে দেয়:type WINFILE.txt | conv

এই এমএসভিসিএলবিএক্স লাইব্রেরি কোনওভাবেই সম্পূর্ণ নয় এবং এর উন্নতির জন্য অবদানগুলি স্বাগত!


2

জাভাতে আমি ফাইলটি লেখার জন্য "IBM850" এনকোডিং ব্যবহার করেছি। যে সমস্যার সমাধান।

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