سؤال

لدينا مشروع في فريق مؤسسة خادم (TFS) أن لديه غير الإنجليزية حرف (š) في ذلك.عند محاولة النصي بضع بناء الأشياء ذات الصلة عثرنا على مشكلة - لا يمكننا تمرير š رسالة إلى أدوات سطر الأوامر.موجه الأوامر أو ما لا آخر تتلفها ، tf.exe الأداة لا يمكن العثور على مشروع محدد.

لقد حاولت مختلف صيغ .bat (ANSI, UTF-8 مع وبدون بوم) وكذلك البرمجة في جافا سكريبت (وهو Unicode بطبيعتها) - ولكن لم الحظ.كيف يمكنني تنفيذ البرنامج يمر هذا Unicode سطر الأوامر ؟

هل كانت مفيدة؟

المحلول

خلفيتي: أستخدم إدخال / إخراج Unicode في وحدة التحكم لسنوات (وتفعل ذلك يوميا. علاوة على ذلك، أقوم بتطوير أدوات الدعم لهذه المهمة بالضبط). هناك عدد قليل جدا من المشاكل، بقدر ما تفهم الحقائق / القيود التالية:

  • CMD و "وحدة التحكم" هي عوامل غير ذات صلة. CMD.exe هي واحدة فقط من البرامج جاهزة "العمل داخل" وحدة التحكم ("تطبيقات وحدة التحكم").
  • بقدر ما أعلم، CMD لديه دعم مثالي ل Unicode؛ يمكنك إدخال / إخراج جميع unicode chars عندما أي codepage نشط.
  • تحتوي وحدة التحكم Windows على الكثير من الدعم ل Unicode - لكنها ليست مثالية (فقط "جيد بما فيه الكفاية"؛ انظر أدناه).
  • chcp 65001 خطير جدا. ما لم يكن هناك برنامج مصمم خصيصا للعمل حول العيوب في واجهة برمجة التطبيقات في Windows (أو يستخدم مكتبة وقت التشغيل C له هذه الحلول)، فلن يعمل بشكل موثوق. Win8 إصلاحات من هذه المشاكل مع cp65001, ، ولكن الباقي لا يزال ينطبق على WIN10.
  • أنا أعمل في cp1252. وبعد كما قلت بالفعل: لإدخال / إخراج Unicode في وحدة تحكم، لا يحتاج المرء إلى تعيين CODEPAGE.

التفاصيل

  • لقراءة / كتابة Unicode إلى وحدة تحكم، يجب أن تكون تطبيق (أو مكتبة وقت التشغيل C) ذكية بما يكفي لاستخدامها لا File-I/O API، ولكن Console-I/O API. (للحصول على مثال، انظر كيف الثعبان يفعل ذلك.)
  • وبالمثل، لقراءة وسيطات سطر الأوامر Unicode، يجب أن يكون تطبيق (أو مكتبة وقت التشغيل C) ذكية بما يكفي لاستخدام API المقابلة.
  • يوفر عرض خط وحدة التحكم أحرف Unicode فقط في BMP (بمعنى آخر: أدناه U+10000). يتم دعم التقديم النصي البسيط الوحيد (حتى الأوروبي - وبعض اللغات شرق آسيا - يجب أن تعمل بشكل جيد - بقدر ما يستخدم المرء النماذج المبدعة). [هناك غرامة طفيفة الطباعة هنا لشرق آسيا والشخصيات U + 0000، U + 0001، U + 30FB.

اعتبارات عملية

  • ال الافتراضات في النافذة ليست مفيدة للغاية. للحصول على أفضل تجربة، يجب على المرء ضبط 3 قطع من التكوين:

    • للإخراج: خط وحدة تحكم شاملة. للحصول على أفضل النتائج، أوصي مباني بلدي. وبعد (توجد إرشادات التثبيت موجودة هناك - وكذلك المدرجة أيضا في إجابات أخرى على هذه الصفحة.)
    • للإدخال: تخطيط لوحة مفاتيح قادرة. للحصول على أفضل النتائج، أوصي تخطيطاتي.
    • للإدخال: السماح مدخل عرافة من يونيكود.
  • واحد أكثر gotcha مع "لصق" في تطبيق وحدة التحكم (تقنية جدا):

    • مدخل عرافة يسلم شخصية على KeyUp من Alt; الكل الطرق الأخرى لتقديم شخصية تحدث KeyDown; ؛ لذلك العديد من التطبيقات ليست جاهزة لرؤية شخصية على KeyUp. وبعد (ينطبق فقط على التطبيقات باستخدام Console-I/O API.)
    • الخلاصة: لن يتفاعل العديد من التطبيقات على أحداث مدخلات عرافة.
    • علاوة على ذلك، فإن ما يحدث مع حرف "لصق" يعتمد على تخطيط لوحة المفاتيح الحالي: إذا كانت الشخصية يمكن كتابةها دون استخدام مفاتيح البادئة (ولكن مع مزيج تعسف معقد من المعدلات، كما هو الحال في Ctrl-Alt-AltGr-Kana-Shift-Gray*) ثم يتم تسليمها على مفاتيح محاكاة. هذا هو ما يتوقعه أي تطبيق - لذلك لصق أي شيء يحتوي فقط على مثل هذه الأحرف على ما يرام.
    • ومع ذلك، يتم تسليم أحرف "أخرى" بواسطة محاكاة مدخل عرافة.

    خاتمة: ما لم يكن تخطيط لوحة المفاتيح يدعم إدخال الكثير من الأحرف دون مفاتيح البادئة، بعض التطبيقات التي تجرها الدواب قد تخطي الأحرف عندما Paste عبر وحدة التحكم في وحدة التحكم: Alt-Space E P. (هذه هو السبب في أنني أوصي باستخدام تخطيطات لوحة المفاتيح الخاصة بي!)

يجب أن يضع المرء أيضا في الاعتبار أن لوحات مفاتيح "البديل" أكثر قابلية "لنظام التشغيل Windows ليست لوحات لوحات لوحات على الإطلاق. وبعد انهم لا يدعمون Console-I/O واجهات برمجة التطبيقات، وبالتالي فإن البرامج التي تعتمد على واجهات برمجة التطبيقات هذه لن تعمل. (سوف تعمل البرامج التي تستخدم فقط "ملفات برمجة تطبيقات الملفات I / O إلى Filehandles Console" بشكل جيد، رغم ذلك.)

مثال واحد لمثل هذه وحدة التحكم هو جزء من Microsoft Powershell. وبعد انا لا استخدمه؛ للتجربة والصحافة والإفراج WinKey, ، ثم اكتب powershell.


(من ناحية أخرى، هناك برامج مثل ConEmu أو ANSICON التي تحاول أن تفعل المزيد: أنها "محاولة" لاعتراض Console-I/O واجهات برمجة التطبيقات لجعل "تطبيقات وحدة التحكم الحقيقية" تعمل أيضا. هذا يعمل بالتأكيد لبرامج مثال لعبة؛ في الحياة الحقيقية، قد لا يحل هذا أو لا يحل مشاكلك الخاصة. تجربة - قام بتجارب.)

ملخص

  • قم بتعيين الخط، تخطيط لوحة المفاتيح (واختياريا، اسمح بإدخال عرافة).

  • استخدم فقط البرامج التي تمر Console-I/O أبيس، وقبول حجج سطر الأوامر يونيكود. على سبيل المثال، أي cygwinيجب أن يكون البرنامج على ما يرام. كما قلت بالفعل، CMD على ما يرام أيضا.

تحديث في البداية، لعلة في cp65001, ، كنت خلط نواة وطبقات crtl (²: و Windows وضع المستخدم واجهة برمجة التطبيقات!). أيضا: Win8 إصلاح نصف هذا الخطأ؛ قمت بتوضيح القسم حول تطبيق "أفضل وحدة التحكم"، وأضاف إشارة إلى كيف يفعله بيثون ذلك.

نصائح أخرى

يحاول:

chcp 65001

والتي ستغير صفحة الرموز إلى UTF-8. أيضا، تحتاج إلى استخدام خطوط وحدة التحكم Lucida.

كان لدي نفس المشكلة (أنا من جمهورية التشيك). لدي تثبيت إنجليزي لنظام Windows، وعلي أن أعمل مع الملفات على محرك أقراص مشترك. تتضمن مسارات الملفات أحرفا خاصة بالتشيك.

الحل الذي يعمل بالنسبة لي هو:

في ملف دفعي، قم بتغيير صفحة Charset

ملف دفعي الخاص بي:

chcp 1250
copy "O:\VEŘEJNÉ\ŽŽŽŽŽŽ\Ž.xls" c:\temp

يجب حفظ الملف الدفعي في CP 1250.

لاحظ أن وحدة التحكم لن تظهر الأحرف بشكل صحيح، لكنها سوف تفهمهم ...

تحقق من لغة برامج غير Unicode. إذا كانت لديك مشاكل مع اللغة الروسية في وحدة التحكم في Windows، فيجب عليك تعيين الروسية هنا:

Changing language for non-Unicode programs

من الصعب للغاية تغيير وحدة التحكم الافتراضية ل Windows Console. عند البحث في الويب، تجد مقترحات مختلفة، إلا أن بعضها قد يكسر Windows بالكامل، أي جهاز الكمبيوتر الخاص بك لا يتم الحذاء بعد الآن.

الحل الأكثر أمانا هو هذا واحد: انتقل إلى مفتاح التسجيل الخاص بك HKEY_CURRENT_USER\Software\Microsoft\Command Processor وإضافة قيمة سلسلة Autorun = chcp 65001.

أو يمكنك استخدام هذا البرنامج النصي الدفعة الصغيرة للحصول على صفحات الرمز الأكثر شيوعا.

@ECHO off

SET ROOT_KEY="HKEY_CURRENT_USER"


FOR /f "skip=2 tokens=3" %%i in ('reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage /v OEMCP') do set OEMCP=%%i

ECHO System default values:

ECHO.
ECHO ...............................................
ECHO Select Codepage 
ECHO ...............................................
ECHO.
ECHO 1 - CP1252
ECHO 2 - UTF-8
ECHO 3 - CP850
ECHO 4 - ISO-8859-1
ECHO 5 - ISO-8859-15
ECHO 6 - US-ASCII
ECHO.
ECHO 9 - Reset to System Default (CP%OEMCP%)
ECHO 0 - EXIT
ECHO.


SET /P  CP="Select a Codepage: "

if %CP%==1 (
    echo Set default Codepage to CP1252
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 1252>nul" /f
) else if %CP%==2 (
    echo Set default Codepage to UTF-8
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 65001>nul" /f
) else if %CP%==3 (
    echo Set default Codepage to CP850
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 850>nul" /f
) else if %CP%==4 (
    echo Set default Codepage to ISO-8859-1
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28591>nul" /f
) else if %CP%==5 (
    echo Set default Codepage to ISO-8859-15
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28605>nul" /f
) else if %CP%==6 (
    echo Set default Codepage to ASCII
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 20127>nul" /f
) else if %CP%==9 (
    echo Reset Codepage to System Default
    reg delete "%ROOT_KEY%\Software\Microsoft\Command Processor" /v AutoRun /f
) else if %CP%==0 (
    echo Bye
) else (
    echo Invalid choice
    pause
)

استخدام @chcp 65001>nul بدلا من chcp 65001 قمع إخراج "صفحة الكود النشط": 65001 "ستحصل في كل مرة تبدأ فيها بدء تشغيل Windows New Command Windows.

قائمة كاملة بجميع الرقم المتاح يمكنك الحصول عليها معرفات صفحة الكود

ملاحظة، ستتقدم الإعدادات فقط للمستخدم الحالي. إذا كنت ترغب في إعداده لجميع المستخدمين، استبدل الخط SET ROOT_KEY="HKEY_CURRENT_USER" بواسطة SET ROOT_KEY="HKEY_LOCAL_MACHINE"

في الواقع، الحيلة هي أن موجه الأوامر يفهم فعلا هذه الأحرف غير الإنجليزية هذه، فقط لا يمكن عرضها بشكل صحيح.

عندما أدخل مسارا في موجه الأوامر يحتوي على بعض rihacters غير الإنجليزية يتم عرضه على أنه "؟؟؟؟؟؟؟ ؟؟؟؟". عند إرسال الأمر الخاص بك (CD "؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟" في حالتي)، كل شيء يعمل كما هو متوقع.

على جهاز Windows 10 X64، قمت بإجراء أحرف موجه الأوامر غير الإنجليزية من قبل:

افتح موجه أمر مرتفع (تشغيل cmd.exe كمسؤول). الاستعلام عن السجل الخاص بك للحصول على خطوط TrueType المتاحة إلى وحدة التحكم عن طريق:

    REG query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont"

سترى إخراج مثل:

    0    REG_SZ    Lucida Console
    00    REG_SZ    Consolas
    936    REG_SZ    *新宋体
    932    REG_SZ    *MS ゴシック

الآن نحتاج إلى إضافة خط تروتايب يدعم الأحرف التي تحتاجها مثل courier جديد. نقوم بذلك عن طريق إضافة الأصفار إلى اسم السلسلة، لذلك في هذه الحالة، سيكون "000" التالي:

    REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont" /v 000 /t REG_SZ /d "Courier New"

الآن نحن ننفذ دعم UTF-8:

    REG ADD HKCU\Console /v CodePage /t REG_DWORD /d 65001 /f

اضبط الخط الافتراضي على "Courier New":

    REG ADD HKCU\Console /v FaceName /t REG_SZ /d "Courier New" /f

ضبط حجم الخط إلى 20:

    REG ADD HKCU\Console /v FontSize /t REG_DWORD /d 20 /f

تمكين تحرير سريع إذا أردت:

    REG ADD HKCU\Console /v QuickEdit /t REG_DWORD /d 1 /f

نظرا لأنني لم أر أي إجابات كاملة لبيرون 2.7، فسوف أوجز الخطوتين الهامة والخطوة الاختيارية مفيدة للغاية.

  1. تحتاج إلى خط مع دعم Unicode. يأتي Windows مع وحدة التحكم Lucida التي قد يتم اختيارها بواسطة انقر بزر الماوس الأيمن فوق شريط العنوان موجه الأوامر والنقر فوق Defaults اختيار. هذا يتيح أيضا الوصول إلى الألوان. لاحظ أنه يمكنك أيضا تغيير الإعدادات لاستدعاء Windows Windows طرق معينة (على سبيل المثال، فتح هنا، Visual Studio) عن طريق الاختيار Properties في حين أن.
  2. تحتاج إلى تعيين صفحة الرموز إلى cp65001, ، والتي يبدو أنها محاولة Microsoft لتقديم دعم UTF-7 و UTF-8 موجه الأوامر. القيام بذلك عن طريق الجري chcp 65001 في موجه الأوامر. وبعد بمجرد الإعداد، يبقى بهذه الطريقة حتى يتم إغلاق النافذة. ستحتاج إلى إعادة هذا في كل مرة تقوم فيها بتشغيل cmd.exe.

لحل أكثر دامة، راجع هذه الإجابة على مستخدم سوبر. باختصار، قم بإنشاء REG_SZ (سلسلة) إدخال باستخدام regedit في HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor وتسميته AutoRun. وبعد تغيير قيمة ذلك إلى chcp 65001. وبعد إذا كنت لا ترغب في رؤية رسالة الإخراج من الأمر، فاستخدم @chcp 65001>nul في حين أن.

بعض البرامج لها مشكلة في التفاعل مع هذا الترميز، تكون MINGW واحدة ملحوظة يفشل أثناء تجميع رسالة خطأ نونية. ومع ذلك، فإن هذا يعمل بشكل جيد للغاية ولا يسبب الحشرات مع غالبية البرامج.

واحدة بسيطة حقا خيار تثبيت ويندوز باش قذيفة مثل مينغو واستخدام ذلك:

Enter image description here

هناك قليلا من منحنى التعلم كما أنك سوف تحتاج إلى استخدام سطر الأوامر يونكس وظائف, ولكن سوف الحب قوة و يمكنك تعيين وحدة التحكم في مجموعة الأحرف إلى UTF-8.

Enter image description here

بالطبع يمكنك أيضا الحصول على جميع المعتاد *nix الأشياء الجيدة مثل البقرى, تجد, أقل, الخ.

لمشكلة مماثلة، (كانت مشكلتي لإظهار أحرف UTF-8 من MySQL في موجه الأوامر)،

حلها مثل هذا:

  1. لقد غيرت خط موجه الأوامر إلى وحدة التحكم Lucida. (يجب أن تكون هذه الخطوة غير ذات صلة بموقفك. يجب أن تفعل فقط مع ما تراه على الشاشة وليس مع ما هو الحرف حقا).

  2. لقد غيرت CODEPAGE إلى Windows-1253. يمكنك القيام بذلك في موجه الأوامر بواسطة "CHCP 1253". عملت في حالتي حيث أردت أن أرى UTF-8.

لقد وجدت هذه الطريقة مفيدة في إصدارات جديدة من نظام التشغيل Windows 10:

قم بتشغيل هذه الميزة: "Beta: استخدم Unicode UTF-8 للحصول على دعم اللغة في جميع أنحاء العالم"

لوحة التحكم -> الإعدادات الإقليمية -> علامة التبويب الإدارية-> تغيير نظام النظام ...

Region Settings

هذه المشكلة مزعجة تماما. عادة ما يكون لدي شخصية صينية في اسم الملف الخاص بي ومحتوى الملفات. يرجى ملاحظة أنني أستخدم Windows 10، إليك حلاي:

لعرض اسم الملف, ، مثل dir أو ls إذا قمت بتثبيت Ubuntu Bash على Windows 10

  1. اضبط المنطقة على دعم حرف غير UTF 8.

  2. بعد ذلك، سيتم تغيير خط Console إلى خط هذا الإعدادات المحلية، كما أنه يغير ترميز وحدة التحكم.

بعد أن فعلت الخطوات السابقة، من أجل عرض ملف المحتوى من ملف UTF-8 باستخدام أداة سطر الأوامر

  1. تغيير الصفحة إلى UTF-8 بواسطة chcp 65001
  2. التغيير إلى الخط الذي يدعم UTF-8، مثل وحدة التحكم Lucida
  3. يستخدم type أمر لإلقاء نظرة على محتوى الملف، أو cat إذا قمت بتثبيت Ubuntu Bash على Windows 10
  4. يرجى ملاحظة أنه بعد تعيين ترميز وحدة التحكم إلى UTF-8، لا يمكنني كتابة الشخصية الصينية في CMD باستخدام طريقة الإدخال الصينية.

الحل الكاردان: فقط استخدم محاكي وحدة التحكم مثل http://cmder.net/

قرارا سريعا لملفات .bat إذا شاش جهاز الكمبيوتر الخاص بك اسم الملف / الملف الصحيح عند كتابةه في إطار DOS:

  1. نسخ con temp.txt. اضغط دخول
  2. اكتب اسم الملف / الملف [اضغط ENTER
  3. صحافة Ctrl-Z. اضغط دخول

بهذه الطريقة يمكنك إنشاء ملف .txt - temp.txt. افتحه في المفكرة، انسخ النص (لا تقلق، سيبدو غير قابل للقراءة) ولصقه في ملف .bat الخاص بك. تنفيذ .bat تم إنشاؤه بهذه الطريقة في نافذة DOS - عملت من أجل MЕ (السيريلية، البلغارية).

شيء أفضل منظف للقيام به: فقط تثبيت حزمة اللغة اليابانية مجانا، مجانا، Microsoft. (سوف تعمل حزم اللغة الشرقية الأخرى، لكنني اختبرت اليابانية.

يمنحك هذا الخطوط التي تحتوي على مجموعات أكبر من Glyphs، مما يجعلها السلوك الافتراضي، وتغيير أدوات Windows المختلفة مثل CMD، WordPad، إلخ.

تغيير صفحة الرموز إلى 1252 يعمل بالنسبة لي. المشكلة بالنسبة لي هي رمز Double Doll § يحول إلى رمز آخر بواسطة DOS على Windows Server 2008.

لقد استخدمت CHCP 1252 وغطاء قبل ذلك في بيان BCP الخاص بي ^ §.

أرى العديد من الإجابات هنا, ولكن لا يبدو أن معالجة مسألة - المستخدم يريد الحصول على Unicode المدخلات من سطر الأوامر.

يستخدم Windows UTF-16 لترميز في اثنين من سلاسل بايت, لذلك تحتاج إلى الحصول على هذه من نظام التشغيل في البرنامج الخاص بك.هناك طريقتان للقيام بذلك -

1) مايكروسوفت قد التمديد التي تسمح الرئيسية لاتخاذ واسعة صفيف حرف:الباحث wmain(int argc, wchar_t *argv[]); https://msdn.microsoft.com/en-us/library/6wd819wh.aspx

2) استدعاء windows api للحصول على إصدار unicode من سطر الأوامر wchar_t win_argv = (wchar_t)CommandLineToArgvW(GetCommandLineW(), &nargs); https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw

قراءة هذا: http://utf8everywhere.org لمزيد من المعلومات التفصيلية ، خاصة إذا كنت دعم أنظمة التشغيل الأخرى.

ابتداء من حزيران / يونيه عام 2019 مع ويندوز 10 لن تضطر إلى تغيير صفحة الترميز اللغوي.

انظر "إدخال Windows Terminal"(من كايلا القرفة) ، مايكروسوفت/محطة.
من خلال استخدام Consolas الخط ، جزئية دعم يونيكود سيتم توفيرها.

كما هو موثق في Microsoft/Terminal مسألة 387:

هناك 87,887 ideographs حاليا في Unicode.تحتاج كل منهم أيضا ؟
نحن بحاجة إلى الحدود ، وشخصيات خارج تلك الحدود يجب أن يتم التعامل معها من خلال الخط الاحتياطي / font ربط / أيا كان.

ما Consolas ينبغي أن تشمل:

  • الشخصيات التي تستخدم الرموز التي يستخدمها الحديثة OSS البرامج في CLI.
  • هذه الشخصيات يجب أن تتبع Consolas' التصميم و القياسات و محاذاة بشكل صحيح مع القائمة Consolas الشخصيات.

ما Consolas لا يجب أن تشمل:

  • الأحرف وعلامات الترقيم من النصوص التي تتجاوز اللاتينية واليونانية والسيريلية ، وخاصة الشخصيات تحتاج مجمع تشكيل (مثل العربية).
  • هذه الشخصيات يجب التعامل مع الخط الاحتياطي.

حصلت حول مشكلة مماثلة حذف الملفات المسماة Unicode عن طريق الرجوع إليها في ملف الدفعات بواسطة أسماءها القصيرة (8 نقاط 3).

يمكن عرض الأسماء القصيرة عن طريق القيام به dir /x. وبعد من الواضح أن هذا يعمل فقط مع أسماء ملفات Unicode المعروفة بالفعل.

إلى UTF-8: chcp 65001

العودة إلى الافتراضي: chcp 437

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top