سؤال

هذا السؤال لديه بالفعل إجابة هنا:

كيف يمكنني لون إخراج جافا؟

على سبيل المثال في C ولغات أخرى يمكنني استخدام ANSI-Escape \033[0m لفعل هذا. ولكن في جافا لا يعمل.

public static void main(String[] x) {
    System.out.println("\033[0m BLABLA \033[0m\n");
}
هل كانت مفيدة؟

المحلول

لا، ولكن هناك API لجهة خارجية يمكنها التعامل معها

http://www.javaworld.com/javaworld/javaqa/2002-12/02-QA-1220-Console.html.

تحرير: بالطبع هناك مقالات أحدث من تلك التي نشرتها، لا تزال المعلومات قابلة للحياة.

نصائح أخرى

ملحوظة

قد لا تكون قادرا على لون النافذة cmd prompt, ، ولكن يجب أن تعمل في العديد من محطات UNIX (أو UNIX).

لاحظ أيضا أن بعض المحطات الطرفية ببساطة لن تدعم بعض تسلسل الهروب من ANSI (إن وجدت)، وخاصة ألوان 24 بت.

الاستعمال

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


TL؛ دكتور

  • جاوة: System.out.println((char)27 + "[31m" + "ERROR MESSAGE IN RED");

  • بيثون: print(chr(27) + "[31m" + "ERROR MESSAGE IN RED")

  • سحق أو زيش: printf '\x1b[31mERROR MESSAGE IN RED'
    • قد يعمل هذا أيضا من أجل نظام التشغيل X: printf '\e[31mERROR MESSAGE IN RED'
  • ش: printf 'كنترول+الخامس,كنترول+[[31mERROR MESSAGE IN RED'
    • أي، الصحافة CTRL + خامسا وثم CTRL + [ من أجل الحصول على "الخام" خروج شخصية عندما الهروب من التفسير غير متوفر
    • إذا فعلت بشكل صحيح، يجب أن ترى ^[. وبعد على الرغم من أنها تبدو وكأنها حرفين، إلا أنها حقا واحدة فقط، خروج حرف.
    • يمكنك أيضا الضغط كنترول+الخامس,كنترول+[ في همة في أي من البرمجة أو sripting langauges لأن هذا يستخدم حرفيا خروج حرف
    • أيضا، يمكنك استبدال كنترول+[ مع خروج ... على سبيل المثال، يمكنك استخدام كنترول+الخامس,خروج, ، لكنني أجد الأسهل السابق، لأنني ضغط بالفعل كنترول ومنذ ذلك [ هو أقل بعيدا عن الطريق.

ANSI الهروب التسلسلات

خلفية حول تسلسل الهروب

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

تسلسل الهروب هو سلسلة من الأحرف المستخدمة لتغيير حالة أجهزة الكمبيوتر والأجهزة الطرفية المرفقة. تعرف هذه أيضا باسم تسلسل التحكم، مما يعكس استخدامها في التحكم في الجهاز.

backgound على تسلسل الهروب من ANSI

ومع ذلك، يصبح الأمر أسهل من ذلك في محطات نص الفيديو، مثل استخدام المحطات ANSI الهروب التسلسلات. وبعد من هذا الرابط:

تعد تسلسل ANSI Escape معيار للإشارات الموجودة في النطاق للتحكم في موقع المؤشر واللون والخيارات الأخرى الموجودة على محطات نص الفيديو. تتضمن بعض تسلسلات بايت، معظمها بدءا من ESC و [''، في النص، والتي تبحث الطرف عنها وتفسرها كأوامر، وليس ككوترز الأحرف.

كيفية استخدام تسلسل الهروب ANSI

عموما

  • تسلسل الهروب تبدأ بحرف الهروب؛ للحصول على تسلسل الهروب من ANSI، يبدأ التسلسل دائما خروج (ASCII: 27 / عرافة: 0x1B).
  • للحصول على قائمة بما يمكنك القيام به، الرجوع إلى قائمة تسلسل ANSI للهروب على ويكيبيديا

في لغات البرمجة

لن تفسر بعض Langauges البرمجة (مثل Java) \e أو \x1b كما خروج حرف. ومع ذلك، نحن نعلم أن شخصية ASCII 27 يكون ال خروج شخصية، لذلك يمكننا ببساطة typecast 27 إلى أ char واستخدام ذلك لبدء تسلسل الهروب.

فيما يلي بعض الطرق للقيام بذلك بلغات البرمجة المشتركة:

  • جاوة

    • System.out.println((char)27 + "[33mYELLOW");
  • بيثون 3.

    • print(chr(27) + "[34mBLUE");
    • print("\x1b[35mMAGENTA");
      • لاحظ أن \x1b يتم تفسيره بشكل صحيح في بيثون
  • عقدة JS.

    • الإرادة التالية ليس إخراج اللون في JavaScript في وحدة التحكم في الويب
    • console.log(String.fromCharCode(27) + "[36mCYAN");
    • console.log("\x1b[30;47mBLACK_ON_WHITE");
      • لاحظ أن \x1b يعمل أيضا في العقدة

في شل موجه أو البرامج النصية

إذا كنت تعمل مع سحق أو زيش, ، من السهل جدا تلوين الإخراج (في معظم المحطات). في Linux، OS X، وفي بعض محطات الإطار، يمكنك التحقق لمعرفة ما إذا كانت المحطة تدعم اللون عن طريق القيام بكلتا التالي:

  • printf '\e[31mRED'
  • printf '\x1b[31mRED'

إذا رأيت اللون لكليهما، فهذا رائع! إذا رأيت لون واحد فقط، فاستخدم هذا التسلسل. إذا كنت لا ترى اللون لأي منها، فقم بفحص مزدوج للتأكد من أنك كتبت كل شيء بشكل صحيح وأنك في باش أو ZSH؛ إذا كنت لا تزال لا ترى أي لون، فربما لا يدعم الطرف الخاص بك تسلسل الهروب من ANSI.

إذا كنت أتذكر بشكل صحيح، تميل محطات Linux إلى دعم كلاهما \e و \x1b تسلسل الهروب، بينما تميل أجهزة OS X فقط إلى الدعم \e, ، ولكن قد أكون مخطئا. ومع ذلك، إذا رأيت شيئا مثل الصورة التالية، فأنت كل مجموعة! (لاحظ أنني أستخدم القذيفة، زيش, ، وهو تلوين سلسلة موجه؛ أيضا، أنا أستخدم urxvt. كما محطة بلدي في لينكس.)

ANSI Escape Sequences Coloring Text Red

"كيف يعمل هذا؟" ربما تسال. Bascially، printf يفسر تسلسل الأحرف التي تتبع (كل شيء داخل ونقلت واحدة). متي printf لقاءات \e أو \x1b, ، سوف يحول هذه الشخصيات إلى خروج شخصية (ASCII: 27). هذا فقط ما نريد. حاليا، printf يرسل خروج31m, ، وبما أن هناك خروج تليها تسلسل الفريق ANSI صالح، يجب أن نحصل على إخراج ملون (طالما أنه مدعوم من المحطة).

تستطيع ايضا استخذام echo -e '\e[32mGREEN' (على سبيل المثال)، إلى إخراج اللون. نلاحظ أن -e علم ل echo [تمكن] تفسير الفئة الخلفي للهرب" ويجب أن تستخدم إذا كنت تريد echo للتفسير بشكل مناسب تسلسل الهروب.


المزيد عن تسلسل الهروب من ANSI

يمكن أن تفعل تسلسلات الهروب من ANSI أكثر من مجرد إخراج اللون، ولكن لنبدأ بهذا، ونرى بالضبط كيف يعمل اللون؛ بعد ذلك، سنرى كيفية التعامل مع المؤشر؛ أخيرا، سوف نلقي نظرة وشاهد كيفية استخدام لون 8 بت وكذلك لون 24 بت (على الرغم من أنه يحتوي فقط على دعم ضعيف).

على ويكيبيديا, ، يشيرون إلى خروج[ كما CSI, ، لذلك سأفعل نفس الشيء.

اللون

إلى اللون الإخراج باستخدام ENSI Escapes، استخدم ما يلي:

  • CSI n m
    • CSI: هروب الشخصية-^[[ أو خروج[
    • n: رقم واحد مما يلي:
      • 30-37, 39: مقدمة
      • 40-47, 49: معرفتي
    • m: ASCII الحرفي m--Minates تسلسل الهروب

سأستخدم BASH أو ZSH لإظهار جميع مجموعات الألوان المحتملة. Plop ما يلي في BASH أو ZSH لمعرفة لنفسك (قد تحتاج إلى استبدال \e مع \x1b):

  • for fg in {30..37} 39; do for bg in {40..47} 49; do printf "\e[${fg};${bg}m~TEST~"; done; printf "\n"; done;

نتيجة:

various foreground/background colors using ANSI escapes

مرجع سريع (اللون)

+~~~~~~+~~~~~~+~~~~~~~~~~~+
|  fg  |  bg  |  color    |
+~~~~~~+~~~~~~+~~~~~~~~~~~+
|  30  |  40  |  black    |
|  31  |  41  |  red      |
|  32  |  42  |  green    |
|  33  |  43  |  yellow   |
|  34  |  44  |  blue     |
|  35  |  45  |  magenta  |
|  36  |  46  |  cyan     |
|  37  |  47  |  white    |
|  39  |  49  |  default  |
+~~~~~~+~~~~~~+~~~~~~~~~~~+

حدد Rendition الرسم (SGR)

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

اللون يقع في الواقع تحت SGR، وبالتالي فإن بناء الجملة هو نفسه:

  • CSI n m
    • CSI: هروب الشخصية-^[[ أو خروج[
    • n: رقم واحد مما يلي:
      • 0: إعادة تعيين
      • 1-9: يتحول إلى تأثيرات نصية مختلفة
      • 21-29: ينطفئ تأثيرات نصية مختلفة (أقل معتمدة من 1-9)
      • 30-37, 39: لون المقدمة
      • 40-47, 49: لون الخلفية
      • 38: 8- أو 24 بت اللون الأمامي (انظر 8/24 بت اللون أقل)
      • 48: 8- أو 24 بت لون الخلفية (انظر 8/24 بت اللون أقل)
    • m: ASCII الحرفي m--Minates تسلسل الهروب

على الرغم من وجود دعم ضعيف فقط للاخلد (2)، مائل (3)، تسطير (4)، وامض (5،6)، عكس الفيديو (7)، إخفاء (8)، وعبرت (9)، بعض (ولكن نادرا ما) تميل إلى العمل على محطات Linux و OS X.

من المفيد أيضا أن نلاحظ أنه يمكنك فصل أي من السمات المذكورة أعلاه مع نصف كولون. علي سبيل المثال printf '\e[34;47;1;3mCRAZY TEXT\n' سيظهر CRAZY TEXT مع blue foreground على white background, ، وسوف يكون bold و italic.

على سبيل المثال:

string attributes together example screenshot

Plop ما يلي في BASH أو ZSH Shell لرؤية كل تأثيرات النص التي يمكنك القيام بها. (قد تحتاج إلى استبدال \e مع \x1b.)

  • for i in {1..9}; do printf "\e[${i}m~TEST~\e[0m "; done

نتيجة:

SGR state 1 SGR state 2

يمكنك أن ترى أن الطرفي يدعم كل تأثيرات النص إلا بالنسبة إغماء (2), إخفاء (8) و اقطع (9).

مرجع سريع (SGR سمات 0-9)

+~~~~~+~~~~~~~~~~~~~~~~~~+
|  n  |  effect          |
+~~~~~+~~~~~~~~~~~~~~~~~~+
|  0  |  reset           |
|  1  |  bold            |
|  2  |  faint*          |
|  3  |  italic**        |
|  4  |  underline       |
|  5  |  slow blink      |
|  6  |  rapid blink*    |
|  7  |  inverse         |
|  8  |  conceal*        |
|  9  |  strikethrough*  |
+~~~~~+~~~~~~~~~~~~~~~~~~+

* not widely supported
** not widely supported and sometimes treated as inverse

لون 8 بت

في حين أن معظم المحطات تدعم هذا، فهي أقل دعما من 0-7,9 الألوان.

بناء الجملة:

  • CSI 38;5; n m
    • CSI: هروب الشخصية-^[[ أو خروج[
    • 38;5;: السلسلة الحرفية التي تشير إلى استخدام ألوان 8 بت للدمج
    • n: رقم واحد مما يلي:
      • 0-255

إذا كنت ترغب في معاينة كل الألوان في المحطة الخاصة بك بطريقة لطيفة، لدي سيناريو جميل على gIst.github.com.

تبدو هكذا:

8-bit color example screenshot

إذا كنت ترغب في تغيير الخلفية باستخدام ألوان 8 بت، ما عليك سوى استبدال 38 مع 48:

  • CSI 48;5; n m
    • CSI: هروب الشخصية-^[[ أو خروج[
    • 48;5;: السلسلة الحرفية التي تشير إلى استخدام ألوان 8 بت للخلفية
    • n: رقم واحد مما يلي:
      • 0-255

اللون 24 بت

المعروف أيضا باسم اللون الحقيقي، يوفر لون 24 بت بعض الوظائف الرائعة حقا. الدعم لهذا هو بالتأكيد ينمو (بقدر ما أعرف أنه يعمل في معظم المحطات الحديثة باستثناء urxvt., ، محطة بلدي [إدراج emoji غاضب]).

لون 24 بت هو في الواقع مدعوم في VIM (انظر VIM Wiki. لمعرفة كيفية تمكين ألوان 24 بت). إنه أنيق حقا لأنه يسحب من الألوان المعرفة ل GIM؛ على سبيل المثال، فإنه يستخدم FG / BG من highlight guibg=#______ guifg=#______ لألوان 24 بت! neato، هاه؟

هنا هو كيف يعمل لون 24 بت:

  • CSI 38;2; r ; g ; b m
    • CSI: هروب الشخصية-^[[ أو خروج[
    • 38;2;: السلسلة الحرفية التي تشير إلى استخدام ألوان 24 بت للسمية
    • r,g,b: الأرقام - يجب أن يكون كل 0-255

لاختبار القليل فقط من الألوان العديدة التي يمكنك الحصول عليها ((2^8)^3 أو 2^24 أو 16777216 possibilites، أعتقد)، يمكنك استخدام هذا في باش أو ZSH:

  • for r in 0 127 255; do for g in 0 127 255; do for b in 0 127 255; do printf "\e[38;2;${r};${g};${b}m($r,$g,$b)\e[0m "; done; printf "\n"; done; done;

النتيجة (هذا في gnome-terminal. حيث urxvt. لا يدعم لون 24 بت ... احصل عليه معا، أوركسفت وصيانة ... حقيقي):

24-bit color example screenshot

إذا كنت تريد ألوان 24 بت للخلفية ... خمنت ذلك! أنت فقط استبدال 38 مع 48:

  • CSI 48;2; r ; g ; b m
    • CSI: هروب الشخصية-^[[ أو خروج[
    • 48;2;: السلسلة الحرفية التي تشير إلى استخدام ألوان 24 بت للخلفية
    • r,g,b: الأرقام - يجب أن يكون كل 0-255

إدراج تسلسل الهروب الخام

بعض الأحيان \e و \x1b لن يعمل. على سبيل المثال، في ش شل، في بعض الأحيان لا يعمل (على الرغم من أنه يفعل على نظامي حاليا, ، لا أعتقد أنه كان يستخدم).

للتحايل على هذا، يمكنك استخدام كنترول+الخامس,كنترول+[ أو كنترولالخامس,خروج

سيؤدي ذلك إلى إدراج "RAW" خروج شخصية (ASCII: 27). سوف تبدو مثل هذا ^[, ، ولكن لا الحنق؛ انها حرف واحد فقط وليس اثنين.

على سبيل المثال:

sh raw escape char example screenshot


لعنات

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

صعودا وتشغيل مع اللعنات

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

لماذا استخدام اللعنات على ansi يهرب؟

إذا قرأت النص أعلاه، فقد تتذكر ذلك \e أو \x1b سوف تعمل في بعض الأحيان مع printf. وبعد حسنا احيانا \e و \x1b لن تعمل على الإطلاق (هذا ليس قياسي وأنا لم أعمل أبدا مع محطة مثل هذا، ولكن من الممكن). الأهم من ذلك، أكثر تسلسل الهروب أكثر تعقيدا (فكر الصفحة الرئيسية وغيرها من مفاتيح متعددة الأحرف) من الصعب دعم كل محطة (إلا إذا كنت على استعداد لقضاء الكثير من الوقت والجهد تحليل TERMINFO و TISTCAP وآمنة كيفية التعامل مع كل محطة).

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

تستخدم معظم تطبيقات اللعنات قاعدة بيانات يمكنها وصف قدرات الآلاف من المحطات المختلفة. هناك بعض التطبيقات، مثل pdcurses، والتي تستخدم برامج تشغيل الأجهزة المتخصصة بدلا من قاعدة بيانات الطرفية. معظم التطبيقات تستخدم TERMINFO؛ بعض استخدام النصفي. اللعنات لديها ميزة القدرة الخلفي لمحطات الخلايا والبساطة. بالنسبة للتطبيق الذي لا يتطلب رسومات محددة بت أو خطوط متعددة، فإن تطبيق الواجهة باستخدام الشتائم عادة ما يكون أكثر بساطة وأسرع من واحد باستخدام مجموعة أدوات X.

معظم الوقت، ستقوم اللعنات بإستطلاع Terminfo وسيتمكن بعد ذلك من فهم كيفية معالجة سمات المؤشر والنصوص. ثم، أنت، مبرمج، استخدم API المقدمة من اللعنات لمعالجة المؤشر أو تغيير لون النص أو السمات الأخرى إذا كانت الوظيفة التي تبحث عنها مطلوبة.

مثال مع بيثون

أجد بيثون سهل الاستخدام حقا، ولكن إذا كنت ترغب في استخدام اللعنات في لغة برمجة مختلفة، فما عليك سوى البحث عنها على Duckduckgo أو أي محرك بحث آخر. :) هنا مثال سريع في بيثون 3:

import curses

def main(stdscr):
    # allow curses to use default foreground/background (39/49)
    curses.use_default_colors()

    # Clear screen
    stdscr.clear()

    curses.init_pair(1, curses.COLOR_RED, -1)
    curses.init_pair(2, curses.COLOR_GREEN, -1)
    stdscr.addstr("ERROR: I like tacos, but I don't have any.\n", curses.color_pair(1))
    stdscr.addstr("SUCCESS: I found some tacos.\n", curses.color_pair(2))

    stdscr.refresh() # make sure screen is refreshed
    stdscr.getkey()  # wait for user to press key

if __name__ == '__main__':
    curses.wrapper(main)

نتيجة:

enter image description here

قد تفكر في نفسك أن هذه هي طريقة أكثر جولة للقيام بالأشياء، لكنها حقا أكبر بكثير من النظام الأساسي (حقا عبر المحطة الطرفية ... على الأقل في عالم النظام الأساسي UNIX و UNIX). للألوان، ليس كذلك الى حد كبير بنفس أهمية، ولكن عندما يتعلق الأمر بدعم تسلسل الهروب المتعدد آخر (مثل الصفحة الرئيسية, نهاية, أعلى الصفحة, اسفل الصفحة, ، إلخ)، ثم يصبح الشتائم أكثر أهمية.

مثال مع الطرد

  • tput هو أداة مساعدة لسطر الأوامر لمعالجة المؤشر والنص
  • tput يأتي مع curses صفقة. إذا كنت ترغب في استخدام تطبيقات العرضية (ISH) في المحطة الطرفية، فيجب عليك استخدام الشفافية، حيث أن يوزع Terminfo أو مهما كان يحتاج إلى مجموعة من الأوامر الموحدة (مثل الشتائم) وإرجاع تسلسل الهروب الصحيح.
  • مثال:
echo "$(tput setaf 1)$(tput bold)ERROR:$(tput sgr0)$(tput setaf 1) My tacos have gone missing"
echo "$(tput setaf 2)$(tput bold)SUCCESS:$(tput sgr0)$(tput setaf 2) Oh good\! I found my tacos\!"

نتيجة:

example with tput

مزيد من المعلومات حول الصفقة

هذا وقد عملت بالنسبة لي:

System.out.println((char)27 + "[31mThis text would show up red" + (char)27 + "[0m");

تحتاج إلى إنهاء [37m" لإرجاع اللون إلى الأبيض (أو ما كنت تستخدمه). إذا لم تفعل ذلك قد يجعل كل شيء يتبع "أحمر".

يمكنك استعمال ال جانسي مكتبة لتقديم تسلسل الهروب من ANSI في Windows.

نعم هو 100٪ ممكن

تعيين classpath =٪ classpath٪؛ D: jansi-1.4.jar؛

جرب هذا الرمز أدناه:

import org.fusesource.jansi.AnsiConsole;
import static org.fusesource.jansi.Ansi.*;
import static org.fusesource.jansi.Ansi.Color.*;

public class Sample

{

  public static void main(String[] args)
  {
    AnsiConsole.systemInstall();

    System.out.println(ansi().fg(RED).a("Hello World").reset());
    System.out.println("My Name is Raman");

    AnsiConsole.systemUninstall();
  }
}

هنا حل وحدة التحكم Win32.

1) احصل على مكتبات Javanativeacess هنا: https://github.com/twall/jna/

2) ستقوم هذان فصول Java بالخدعة.

استمتع.

package com.stackoverflow.util;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.Structure;

public class Win32 {
    public static final int STD_INPUT_HANDLE = -10;
    public static final int STD_OUTPUT_HANDLE = -11;
    public static final int STD_ERROR_HANDLE = -12;

    public static final short CONSOLE_FOREGROUND_COLOR_BLACK        = 0x00;
    public static final short CONSOLE_FOREGROUND_COLOR_BLUE         = 0x01;
    public static final short CONSOLE_FOREGROUND_COLOR_GREEN        = 0x02;
    public static final short CONSOLE_FOREGROUND_COLOR_AQUA         = 0x03;
    public static final short CONSOLE_FOREGROUND_COLOR_RED          = 0x04;
    public static final short CONSOLE_FOREGROUND_COLOR_PURPLE       = 0x05;
    public static final short CONSOLE_FOREGROUND_COLOR_YELLOW       = 0x06;
    public static final short CONSOLE_FOREGROUND_COLOR_WHITE        = 0x07;
    public static final short CONSOLE_FOREGROUND_COLOR_GRAY         = 0x08;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_BLUE   = 0x09;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_GREEN  = 0x0A;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_AQUA   = 0x0B;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_RED    = 0x0C;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_PURPLE = 0x0D;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_YELLOW = 0x0E;
    public static final short CONSOLE_FOREGROUND_COLOR_BRIGHT_WHITE = 0x0F;

    public static final short CONSOLE_BACKGROUND_COLOR_BLACK        = 0x00;
    public static final short CONSOLE_BACKGROUND_COLOR_BLUE         = 0x10;
    public static final short CONSOLE_BACKGROUND_COLOR_GREEN        = 0x20;
    public static final short CONSOLE_BACKGROUND_COLOR_AQUA         = 0x30;
    public static final short CONSOLE_BACKGROUND_COLOR_RED          = 0x40;
    public static final short CONSOLE_BACKGROUND_COLOR_PURPLE       = 0x50;
    public static final short CONSOLE_BACKGROUND_COLOR_YELLOW       = 0x60;
    public static final short CONSOLE_BACKGROUND_COLOR_WHITE        = 0x70;
    public static final short CONSOLE_BACKGROUND_COLOR_GRAY         = 0x80;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_BLUE   = 0x90;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_GREEN  = 0xA0;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_AQUA   = 0xB0;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_RED    = 0xC0;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_PURPLE = 0xD0;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_YELLOW = 0xE0;
    public static final short CONSOLE_BACKGROUND_COLOR_BRIGHT_WHITE = 0xF0;

    // typedef struct _COORD {
    //    SHORT X;
    //    SHORT Y;
    //  } COORD, *PCOORD;
    public static class COORD extends Structure {
        public short X;
        public short Y;
    }

    // typedef struct _SMALL_RECT {
    //    SHORT Left;
    //    SHORT Top;
    //    SHORT Right;
    //    SHORT Bottom;
    //  } SMALL_RECT;
    public static class SMALL_RECT extends Structure {
        public short Left;
        public short Top;
        public short Right;
        public short Bottom;
    }

    // typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
    //    COORD      dwSize;
    //    COORD      dwCursorPosition;
    //    WORD       wAttributes;
    //    SMALL_RECT srWindow;
    //    COORD      dwMaximumWindowSize;
    //  } CONSOLE_SCREEN_BUFFER_INFO;
    public static class CONSOLE_SCREEN_BUFFER_INFO extends Structure {
        public COORD dwSize;
        public COORD dwCursorPosition;
        public short wAttributes;
        public SMALL_RECT srWindow;
        public COORD dwMaximumWindowSize;
    }

    // Source: https://github.com/twall/jna/nonav/javadoc/index.html
    public interface Kernel32 extends Library {
        Kernel32 DLL = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);

        // HANDLE WINAPI GetStdHandle(
        //        __in  DWORD nStdHandle
        //      );
        public int GetStdHandle(
                int nStdHandle);

        // BOOL WINAPI SetConsoleTextAttribute(
        //        __in  HANDLE hConsoleOutput,
        //        __in  WORD wAttributes
        //      );
        public boolean SetConsoleTextAttribute(
                int in_hConsoleOutput, 
                short in_wAttributes);

        // BOOL WINAPI GetConsoleScreenBufferInfo(
        //        __in   HANDLE hConsoleOutput,
        //        __out  PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
        //      );
        public boolean GetConsoleScreenBufferInfo(
                int in_hConsoleOutput,
                CONSOLE_SCREEN_BUFFER_INFO out_lpConsoleScreenBufferInfo);

        // DWORD WINAPI GetLastError(void);
        public int GetLastError();
    }
}
package com.stackoverflow.util;

import java.io.PrintStream;

import com.stackoverflow.util.Win32.Kernel32;

public class ConsoleUtil {
    public static void main(String[] args)
    throws Exception {
        System.out.print("abc");
        static_color_print(
                System.out, 
                "def", 
                Win32.CONSOLE_BACKGROUND_COLOR_RED, 
                Win32.CONSOLE_FOREGROUND_COLOR_BRIGHT_WHITE);
        System.out.print("def");
        System.out.println();
    }

    private static Win32.CONSOLE_SCREEN_BUFFER_INFO _static_console_screen_buffer_info = null; 

    public static void static_save_settings() {
        if (null == _static_console_screen_buffer_info) {
            _static_console_screen_buffer_info = new Win32.CONSOLE_SCREEN_BUFFER_INFO();
        }
        int stdout_handle = Kernel32.DLL.GetStdHandle(Win32.STD_OUTPUT_HANDLE);
        Kernel32.DLL.GetConsoleScreenBufferInfo(stdout_handle, _static_console_screen_buffer_info);
    }

    public static void static_restore_color()
    throws Exception {
        if (null == _static_console_screen_buffer_info) {
            throw new Exception("Internal error: Must save settings before restore");
        }
        int stdout_handle = Kernel32.DLL.GetStdHandle(Win32.STD_OUTPUT_HANDLE);
        Kernel32.DLL.SetConsoleTextAttribute(
                stdout_handle, 
                _static_console_screen_buffer_info.wAttributes);
    }

    public static void static_set_color(Short background_color, Short foreground_color) {
        int stdout_handle = Kernel32.DLL.GetStdHandle(Win32.STD_OUTPUT_HANDLE);
        if (null == background_color || null == foreground_color) {
            Win32.CONSOLE_SCREEN_BUFFER_INFO console_screen_buffer_info = 
                new Win32.CONSOLE_SCREEN_BUFFER_INFO();
            Kernel32.DLL.GetConsoleScreenBufferInfo(stdout_handle, console_screen_buffer_info);
            short current_bg_and_fg_color = console_screen_buffer_info.wAttributes;
            if (null == background_color) {
                short current_bg_color = (short) (current_bg_and_fg_color / 0x10);
                background_color = new Short(current_bg_color);
            }
            if (null == foreground_color) {
                short current_fg_color = (short) (current_bg_and_fg_color % 0x10);
                foreground_color = new Short(current_fg_color);
            }
        }
        short bg_and_fg_color = 
            (short) (background_color.shortValue() | foreground_color.shortValue());
        Kernel32.DLL.SetConsoleTextAttribute(stdout_handle, bg_and_fg_color);
    }

    public static<T> void static_color_print(
            PrintStream ostream, 
            T value, 
            Short background_color, 
            Short foreground_color)
    throws Exception {
        static_save_settings();
        try {
            static_set_color(background_color, foreground_color);
            ostream.print(value);
        }
        finally {
            static_restore_color();
        }
    }

    public static<T> void static_color_println(
            PrintStream ostream, 
            T value, 
            Short background_color, 
            Short foreground_color)
    throws Exception {
        static_save_settings();
        try {
            static_set_color(background_color, foreground_color);
            ostream.println(value);
        }
        finally {
            static_restore_color();
        }
    }
}

لقد أنشأت أ jar مكتبة دعا JCDP. (طابعة تصحيح جافا الملونة).

بالنسبة لنظام Linux، فإنه يستخدم رموز ANSI Escape التي ذكرها WhiteFang، ولكن ملخصاتها باستخدام الكلمات بدلا من الرموز التي هي أكثر بديهية.

بالنسبة للنوافذ، يشتمل بالفعل على مكتبة Jansi ولكن يخلق طبقة تجريدية فوقها، والحفاظ على واجهة بديهية وبسيطة تم إنشاؤها لنظام Linux.

هذه المكتبة مرخصة تحت ميت الترخيص لا تتردد في استخدامه.

القي نظرة على مستودع JCDP's Github.

الطريقة أبسط هي تشغيل البرنامج (غير محدد) في وحدة التحكم Cygwin.

تتمثل الطريقة الثانية في تشغيل البرنامج (غير محدد) في وحدة التحكم في Windows العادية، خطوط الأنابيب الإخراج من خلال TEE.EXE (من توزيع Cygwin أو GIT). سوف يتعرف Tee.exe على رموز الهروب واستدعاء وظائف Winapi المناسبة.

شيء مثل:

java MyClass | tee.exe log.txt
java MyClass | tee.exe /dev/null

يجب تفسير تسلسل الهروب بشيء ما لتحويله إلى اللون. لا تدعم CMD.EXE قياسي يستخدمه Java عند بدء تشغيل سطر الأوامر، لذلك لا يدعم هذا Java.

تحقق من ذلك: لقد استخدمت قيم ANSI مع رمز الهروب وربما لا تعمل في موجه أوامر Windows ولكن في IDES و UNIX Shell. يمكنك أيضا التحقق من مكتبة "Jansi" هنا لدعم ويندوز.

System.out.println("\u001B[35m" + "This text is PURPLE!" + "\u001B[0m");

System.err.println ("errorrrrrrrr") سيقوم بطباعة نص باللون الأحمر على وحدة التحكم.

لقد كتبت مكتبة تسمى ansiscape. يتيح لك كتابة إخراج ملون بطريقة أكثر تنظيما:

مثال:

AnsiScape ansiScape = new AnsiScape();
String colors = ansiScape.format("{red {blueBg Red text with blue background}} {b Bold text}");
System.out.println(colors);

تتيح لك المكتبة أيضا تحديد "فئات الهروب" الخاصة بك أقرب إلى فئات CSS.

مثال:

AnsiScapeContext context = new AnsiScapeContext();

// Defines a "class" for text
AnsiClass text = AnsiClass.withName("text").add(RED);
// Defines a "class" for the title used
AnsiClass title = AnsiClass.withName("title").add(BOLD, BLUE_BG, YELLOW);
// Defines a "class" to render urls
AnsiClass url = AnsiClass.withName("url").add(BLUE, UNDERLINE);

// Registering the classes to the context
context.add(text).add(title).add(url);

// Creating an AnsiScape instance with the custom context
AnsiScape ansiScape = new AnsiScape(context);

String fmt = "{title Chapter 1}\n" +
              "{text So it begins:}\n" +
              "- {text Option 1}\n" +
              "- {text Url: {url www.someurl.xyz}}";

System.out.println(ansiScape.format(fmt));

هذا يعمل في الكسوف فقط لتحويله الأحمر، لا أعرف عن أماكن أخرى.

System.err.println(" BLABLA ");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top