ฉันจะพิมพ์สีในคอนโซลได้อย่างไร ฉันต้องการแสดงข้อมูลเป็นสีเมื่อหน่วยประมวลผลส่งข้อมูลและมีสีต่างกันเมื่อรับข้อมูล
ฉันจะพิมพ์สีในคอนโซลได้อย่างไร ฉันต้องการแสดงข้อมูลเป็นสีเมื่อหน่วยประมวลผลส่งข้อมูลและมีสีต่างกันเมื่อรับข้อมูล
คำตอบ:
หากเทอร์มินัลของคุณรองรับคุณสามารถใช้รหัสหลบหนี ANSIเพื่อใช้สีในเอาต์พุตของคุณ มันใช้งานได้กับ Unix shell prompt; อย่างไรก็ตามมันไม่สามารถใช้งานได้สำหรับ Windows Command Prompt (แม้ว่าจะใช้งานได้กับ Cygwin) ตัวอย่างเช่นคุณสามารถกำหนดค่าคงที่เช่นนี้สำหรับสี:
public static final String ANSI_RESET = "\u001B[0m";
public static final String ANSI_BLACK = "\u001B[30m";
public static final String ANSI_RED = "\u001B[31m";
public static final String ANSI_GREEN = "\u001B[32m";
public static final String ANSI_YELLOW = "\u001B[33m";
public static final String ANSI_BLUE = "\u001B[34m";
public static final String ANSI_PURPLE = "\u001B[35m";
public static final String ANSI_CYAN = "\u001B[36m";
public static final String ANSI_WHITE = "\u001B[37m";
จากนั้นคุณสามารถอ้างอิงผู้ที่จำเป็น
ตัวอย่างเช่นการใช้ค่าคงที่ด้านบนคุณสามารถสร้างเอาต์พุตข้อความสีแดงต่อไปนี้บนเทอร์มินัลที่รองรับ:
System.out.println(ANSI_RED + "This text is red!" + ANSI_RESET);
อัปเดต:คุณอาจต้องการตรวจสอบห้องสมุดJansi มันมี API และมีการรองรับ Windows โดยใช้ JNI ฉันยังไม่ได้ลองเลย อย่างไรก็ตามมันดูมีแนวโน้ม
อัปเดต 2:นอกจากนี้หากคุณต้องการเปลี่ยนสีพื้นหลังของข้อความเป็นสีอื่นคุณสามารถลองทำสิ่งต่อไปนี้เช่นกัน:
public static final String ANSI_BLACK_BACKGROUND = "\u001B[40m";
public static final String ANSI_RED_BACKGROUND = "\u001B[41m";
public static final String ANSI_GREEN_BACKGROUND = "\u001B[42m";
public static final String ANSI_YELLOW_BACKGROUND = "\u001B[43m";
public static final String ANSI_BLUE_BACKGROUND = "\u001B[44m";
public static final String ANSI_PURPLE_BACKGROUND = "\u001B[45m";
public static final String ANSI_CYAN_BACKGROUND = "\u001B[46m";
public static final String ANSI_WHITE_BACKGROUND = "\u001B[47m";
ตัวอย่างเช่น
System.out.println(ANSI_GREEN_BACKGROUND + "This text has a green background but default text!" + ANSI_RESET);
System.out.println(ANSI_RED + "This text has red text but a default background!" + ANSI_RESET);
System.out.println(ANSI_GREEN_BACKGROUND + ANSI_RED + "This text has a green background and red text!" + ANSI_RESET);
if (System.console() == null) System.setProperty("jansi.passthrough", "true");
however it doesn't work for Windows command prompt
นี่คือรายการสีในคลาส Java ที่มีpublic static
ฟิลด์
การใช้
System.out.println(ConsoleColors.RED + "RED COLORED" +
ConsoleColors.RESET + " NORMAL");
หมายเหตุ
อย่าลืมใช้RESET
หลังจากการพิมพ์เนื่องจากเอฟเฟกต์จะยังคงอยู่หากยังไม่ได้ล้าง
public class ConsoleColors {
// Reset
public static final String RESET = "\033[0m"; // Text Reset
// Regular Colors
public static final String BLACK = "\033[0;30m"; // BLACK
public static final String RED = "\033[0;31m"; // RED
public static final String GREEN = "\033[0;32m"; // GREEN
public static final String YELLOW = "\033[0;33m"; // YELLOW
public static final String BLUE = "\033[0;34m"; // BLUE
public static final String PURPLE = "\033[0;35m"; // PURPLE
public static final String CYAN = "\033[0;36m"; // CYAN
public static final String WHITE = "\033[0;37m"; // WHITE
// Bold
public static final String BLACK_BOLD = "\033[1;30m"; // BLACK
public static final String RED_BOLD = "\033[1;31m"; // RED
public static final String GREEN_BOLD = "\033[1;32m"; // GREEN
public static final String YELLOW_BOLD = "\033[1;33m"; // YELLOW
public static final String BLUE_BOLD = "\033[1;34m"; // BLUE
public static final String PURPLE_BOLD = "\033[1;35m"; // PURPLE
public static final String CYAN_BOLD = "\033[1;36m"; // CYAN
public static final String WHITE_BOLD = "\033[1;37m"; // WHITE
// Underline
public static final String BLACK_UNDERLINED = "\033[4;30m"; // BLACK
public static final String RED_UNDERLINED = "\033[4;31m"; // RED
public static final String GREEN_UNDERLINED = "\033[4;32m"; // GREEN
public static final String YELLOW_UNDERLINED = "\033[4;33m"; // YELLOW
public static final String BLUE_UNDERLINED = "\033[4;34m"; // BLUE
public static final String PURPLE_UNDERLINED = "\033[4;35m"; // PURPLE
public static final String CYAN_UNDERLINED = "\033[4;36m"; // CYAN
public static final String WHITE_UNDERLINED = "\033[4;37m"; // WHITE
// Background
public static final String BLACK_BACKGROUND = "\033[40m"; // BLACK
public static final String RED_BACKGROUND = "\033[41m"; // RED
public static final String GREEN_BACKGROUND = "\033[42m"; // GREEN
public static final String YELLOW_BACKGROUND = "\033[43m"; // YELLOW
public static final String BLUE_BACKGROUND = "\033[44m"; // BLUE
public static final String PURPLE_BACKGROUND = "\033[45m"; // PURPLE
public static final String CYAN_BACKGROUND = "\033[46m"; // CYAN
public static final String WHITE_BACKGROUND = "\033[47m"; // WHITE
// High Intensity
public static final String BLACK_BRIGHT = "\033[0;90m"; // BLACK
public static final String RED_BRIGHT = "\033[0;91m"; // RED
public static final String GREEN_BRIGHT = "\033[0;92m"; // GREEN
public static final String YELLOW_BRIGHT = "\033[0;93m"; // YELLOW
public static final String BLUE_BRIGHT = "\033[0;94m"; // BLUE
public static final String PURPLE_BRIGHT = "\033[0;95m"; // PURPLE
public static final String CYAN_BRIGHT = "\033[0;96m"; // CYAN
public static final String WHITE_BRIGHT = "\033[0;97m"; // WHITE
// Bold High Intensity
public static final String BLACK_BOLD_BRIGHT = "\033[1;90m"; // BLACK
public static final String RED_BOLD_BRIGHT = "\033[1;91m"; // RED
public static final String GREEN_BOLD_BRIGHT = "\033[1;92m"; // GREEN
public static final String YELLOW_BOLD_BRIGHT = "\033[1;93m";// YELLOW
public static final String BLUE_BOLD_BRIGHT = "\033[1;94m"; // BLUE
public static final String PURPLE_BOLD_BRIGHT = "\033[1;95m";// PURPLE
public static final String CYAN_BOLD_BRIGHT = "\033[1;96m"; // CYAN
public static final String WHITE_BOLD_BRIGHT = "\033[1;97m"; // WHITE
// High Intensity backgrounds
public static final String BLACK_BACKGROUND_BRIGHT = "\033[0;100m";// BLACK
public static final String RED_BACKGROUND_BRIGHT = "\033[0;101m";// RED
public static final String GREEN_BACKGROUND_BRIGHT = "\033[0;102m";// GREEN
public static final String YELLOW_BACKGROUND_BRIGHT = "\033[0;103m";// YELLOW
public static final String BLUE_BACKGROUND_BRIGHT = "\033[0;104m";// BLUE
public static final String PURPLE_BACKGROUND_BRIGHT = "\033[0;105m"; // PURPLE
public static final String CYAN_BACKGROUND_BRIGHT = "\033[0;106m"; // CYAN
public static final String WHITE_BACKGROUND_BRIGHT = "\033[0;107m"; // WHITE
}
ฉันสร้างห้องสมุดที่ชื่อว่าJCDP ( Java Colored Debug Printer )
สำหรับ Linux, macOS และ Windows 10 มันใช้รหัสหลบหนี ANSI ที่ WhiteFang พูดถึง แต่ย่อท้อให้ใช้คำแทนรหัสซึ่งใช้งานง่ายกว่ามาก มันง่ายเหมือน:
print("Hello World!", Attribute.BOLD, FColor.YELLOW, BColor.GREEN);
คุณมีตัวอย่างบางส่วนที่เก็บข้อมูล GitHub JCDP ของ
ลอง enum ต่อไปนี้:
enum Color {
//Color end string, color reset
RESET("\033[0m"),
// Regular Colors. Normal color, no bold, background color etc.
BLACK("\033[0;30m"), // BLACK
RED("\033[0;31m"), // RED
GREEN("\033[0;32m"), // GREEN
YELLOW("\033[0;33m"), // YELLOW
BLUE("\033[0;34m"), // BLUE
MAGENTA("\033[0;35m"), // MAGENTA
CYAN("\033[0;36m"), // CYAN
WHITE("\033[0;37m"), // WHITE
// Bold
BLACK_BOLD("\033[1;30m"), // BLACK
RED_BOLD("\033[1;31m"), // RED
GREEN_BOLD("\033[1;32m"), // GREEN
YELLOW_BOLD("\033[1;33m"), // YELLOW
BLUE_BOLD("\033[1;34m"), // BLUE
MAGENTA_BOLD("\033[1;35m"), // MAGENTA
CYAN_BOLD("\033[1;36m"), // CYAN
WHITE_BOLD("\033[1;37m"), // WHITE
// Underline
BLACK_UNDERLINED("\033[4;30m"), // BLACK
RED_UNDERLINED("\033[4;31m"), // RED
GREEN_UNDERLINED("\033[4;32m"), // GREEN
YELLOW_UNDERLINED("\033[4;33m"), // YELLOW
BLUE_UNDERLINED("\033[4;34m"), // BLUE
MAGENTA_UNDERLINED("\033[4;35m"), // MAGENTA
CYAN_UNDERLINED("\033[4;36m"), // CYAN
WHITE_UNDERLINED("\033[4;37m"), // WHITE
// Background
BLACK_BACKGROUND("\033[40m"), // BLACK
RED_BACKGROUND("\033[41m"), // RED
GREEN_BACKGROUND("\033[42m"), // GREEN
YELLOW_BACKGROUND("\033[43m"), // YELLOW
BLUE_BACKGROUND("\033[44m"), // BLUE
MAGENTA_BACKGROUND("\033[45m"), // MAGENTA
CYAN_BACKGROUND("\033[46m"), // CYAN
WHITE_BACKGROUND("\033[47m"), // WHITE
// High Intensity
BLACK_BRIGHT("\033[0;90m"), // BLACK
RED_BRIGHT("\033[0;91m"), // RED
GREEN_BRIGHT("\033[0;92m"), // GREEN
YELLOW_BRIGHT("\033[0;93m"), // YELLOW
BLUE_BRIGHT("\033[0;94m"), // BLUE
MAGENTA_BRIGHT("\033[0;95m"), // MAGENTA
CYAN_BRIGHT("\033[0;96m"), // CYAN
WHITE_BRIGHT("\033[0;97m"), // WHITE
// Bold High Intensity
BLACK_BOLD_BRIGHT("\033[1;90m"), // BLACK
RED_BOLD_BRIGHT("\033[1;91m"), // RED
GREEN_BOLD_BRIGHT("\033[1;92m"), // GREEN
YELLOW_BOLD_BRIGHT("\033[1;93m"), // YELLOW
BLUE_BOLD_BRIGHT("\033[1;94m"), // BLUE
MAGENTA_BOLD_BRIGHT("\033[1;95m"), // MAGENTA
CYAN_BOLD_BRIGHT("\033[1;96m"), // CYAN
WHITE_BOLD_BRIGHT("\033[1;97m"), // WHITE
// High Intensity backgrounds
BLACK_BACKGROUND_BRIGHT("\033[0;100m"), // BLACK
RED_BACKGROUND_BRIGHT("\033[0;101m"), // RED
GREEN_BACKGROUND_BRIGHT("\033[0;102m"), // GREEN
YELLOW_BACKGROUND_BRIGHT("\033[0;103m"), // YELLOW
BLUE_BACKGROUND_BRIGHT("\033[0;104m"), // BLUE
MAGENTA_BACKGROUND_BRIGHT("\033[0;105m"), // MAGENTA
CYAN_BACKGROUND_BRIGHT("\033[0;106m"), // CYAN
WHITE_BACKGROUND_BRIGHT("\033[0;107m"); // WHITE
private final String code;
Color(String code) {
this.code = code;
}
@Override
public String toString() {
return code;
}
}
และตอนนี้เราจะทำตัวอย่างเล็ก ๆ :
class RunApp {
public static void main(String[] args) {
System.out.print(Color.BLACK_BOLD);
System.out.println("Black_Bold");
System.out.print(Color.RESET);
System.out.print(Color.YELLOW);
System.out.print(Color.BLUE_BACKGROUND);
System.out.println("YELLOW & BLUE");
System.out.print(Color.RESET);
System.out.print(Color.YELLOW);
System.out.println("YELLOW");
System.out.print(Color.RESET);
}
}
วิธีการพกพาที่ทำได้ค่อนข้างดีคือการใช้ลำดับการหลบหลีกแบบดิบ ดูhttp://en.wikipedia.org/wiki/ANSI_escape_code
[แก้ไขสำหรับผู้ใช้ 9999999 วันที่ 2017-02-20]
Java ไม่ "จัดการกับรหัส" นั่นเป็นความจริง แต่ Java แสดงสิ่งที่คุณบอกให้ส่งออก ไม่ใช่ความผิดของ Java ที่คอนโซล Windows ใช้กับ ESC (chr (27)) เหมือนกับ glyph (←) อื่น
windows
คำถามที่ยังไม่ได้รับการติดแท็ก คอนโซล Windows ไม่เคยเป็นไปตามมาตรฐาน ANSI ที่ฉันจำได้
คุณสามารถทำได้โดยใช้ ANSI escape sequences ฉันได้รวบรวมคลาสนี้ไว้ใน Java สำหรับทุกคนที่ต้องการวิธีแก้ปัญหาง่ายๆสำหรับเรื่องนี้ มันช่วยให้มากกว่ารหัสสี
https://gist.github.com/nathan-fiscaletti/9dc252d30b51df7d710a
(พอร์ตจาก: https://github.com/nathan-fiscaletti/ansi-util )
ตัวอย่างการใช้:
StringBuilder sb = new StringBuilder();
System.out.println(
sb.raw("Hello, ")
.underline("John Doe")
.resetUnderline()
.raw(". ")
.raw("This is ")
.color16(StringBuilder.Color16.FG_RED, "red")
.raw(".")
);
หากใครกำลังมองหาวิธีแก้ปัญหาอย่างรวดเร็วอย่าลังเลที่จะใช้คลาสผู้ช่วยเหลือดังต่อไปนี้ :)
public class Log {
public static final String ANSI_RESET = "\u001B[0m";
public static final String ANSI_BLACK = "\u001B[30m";
public static final String ANSI_RED = "\u001B[31m";
public static final String ANSI_GREEN = "\u001B[32m";
public static final String ANSI_YELLOW = "\u001B[33m";
public static final String ANSI_BLUE = "\u001B[34m";
public static final String ANSI_PURPLE = "\u001B[35m";
public static final String ANSI_CYAN = "\u001B[36m";
public static final String ANSI_WHITE = "\u001B[37m";
//info
public static void i(String className, String message) {
System.out.println(ANSI_GREEN + className + " : " + message + ANSI_RESET);
}
//error
public static void e(String className, String message) {
System.out.println(ANSI_RED + className + " : " + message + ANSI_RESET);
}
//debug
public static void d(String className, String message) {
System.out.println(ANSI_BLUE + className + " : " + message + ANSI_RESET);
}
//warning
public static void w(String className, String message) {
System.out.println(ANSI_YELLOW + className + " : " + message + ANSI_RESET);
}
}
การใช้:
Log.i(TAG,"This is an info message");
Log.e(TAG,"This is an error message");
Log.w(TAG,"This is a warning message");
Log.d(TAG,"This is a debug message");
ขอบคุณ @ whiteFang34 สำหรับรหัส ANSI
วิธีที่ดีที่สุดให้กับข้อความคอนโซลสีคือการใช้รหัสหนี ANSI นอกจากสีข้อความแล้วโค้ดหลบหนีของ ANSI ยังอนุญาตให้ใช้สีพื้นหลังการตกแต่งและอื่น ๆ อีกมากมาย
ยูนิกซ์
หากคุณใช้ springboot จะมี enum เฉพาะสำหรับการระบายสีข้อความ: org.springframework.boot.ansi.AnsiColor
ห้องสมุดJansiเป็นขั้นสูงขึ้นอีกเล็กน้อย (สามารถใช้ ANSI ทั้งหมดรหัสหลบหนี fonctions), ให้ API และมีการสนับสนุนสำหรับ Windowsโดยใช้ JNA
มิฉะนั้นคุณสามารถกำหนดสีของคุณเองได้ดังแสดงเป็นคำตอบอื่น ๆ
Windows 10
Windows 10 (ตั้งแต่บิวด์ 10.0.10586 - พ.ย. 2558) รองรับรหัสหลบหนี ANSI ( เอกสารคู่มือMSDN ) แต่ไม่ได้เปิดใช้งานตามค่าเริ่มต้น วิธีเปิดใช้งาน:
ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0400)
ตั้งค่าสถานะ Jansi ใช้ตัวเลือกนี้HKEY_CURRENT_USER\Console\VirtualTerminalLevel
โดยการสร้าง dword และตั้งเป็น 0 หรือ 1 สำหรับการประมวลผล ANSI:
"VirtualTerminalLevel"=dword:00000001
ก่อนที่ Windows 10
คอนโซล Windows ไม่รองรับสี ANSI แต่เป็นไปได้ที่จะใช้คอนโซลที่ทำ
การใช้ฟังก์ชั่นสีเพื่อพิมพ์ข้อความด้วยสี
รหัส:
enum Color {
RED("\033[0;31m"), // RED
GREEN("\033[0;32m"), // GREEN
YELLOW("\033[0;33m"), // YELLOW
BLUE("\033[0;34m"), // BLUE
MAGENTA("\033[0;35m"), // MAGENTA
CYAN("\033[0;36m"), // CYAN
private final String code
Color(String code) {
this.code = code;
}
@Override
String toString() {
return code
}
}
def color = { color, txt ->
def RESET_COLOR = "\033[0m"
return "${color}${txt}${RESET_COLOR}"
}
การใช้งาน:
test {
println color(Color.CYAN, 'testing')
}
เพื่อขีดฆ่า:
public static final String ANSI_STRIKEOUT_BLACK = "\u001B[30;9m";
public static final String ANSI_STRIKEOUT_RED = "\u001B[31;9m";
public static final String ANSI_STRIKEOUT_GREEN = "\u001B[32;9m";
public static final String ANSI_STRIKEOUT_YELLOW = "\u001B[33;9m";
public static final String ANSI_STRIKEOUT_BLUE = "\u001B[34;9m";
public static final String ANSI_STRIKEOUT_PURPLE = "\u001B[35;9m";
public static final String ANSI_STRIKEOUT_CYAN = "\u001B[36;9m";
public static final String ANSI_STRIKEOUT_WHITE = "\u001B[37;9m";
ทางออกที่ดีที่สุดในการพิมพ์ข้อความใด ๆ ในสีแดงใน Java คือ:
System.err.print("Hello World");
หากคุณใช้ Kotlin (ซึ่งทำงานร่วมกับ Java ได้อย่างราบรื่น) คุณสามารถสร้าง Enum เช่น:
enum class AnsiColor(private val colorNumber: Byte) {
BLACK(0), RED(1), GREEN(2), YELLOW(3), BLUE(4), MAGENTA(5), CYAN(6), WHITE(7);
companion object {
private const val prefix = "\u001B"
const val RESET = "$prefix[0m"
private val isCompatible = "win" !in System.getProperty("os.name").toLowerCase()
}
val regular get() = if (isCompatible) "$prefix[0;3${colorNumber}m" else ""
val bold get() = if (isCompatible) "$prefix[1;3${colorNumber}m" else ""
val underline get() = if (isCompatible) "$prefix[4;3${colorNumber}m" else ""
val background get() = if (isCompatible) "$prefix[4${colorNumber}m" else ""
val highIntensity get() = if (isCompatible) "$prefix[0;9${colorNumber}m" else ""
val boldHighIntensity get() = if (isCompatible) "$prefix[1;9${colorNumber}m" else ""
val backgroundHighIntensity get() = if (isCompatible) "$prefix[0;10${colorNumber}m" else ""
}
จากนั้นใช้เป็นดังนี้: (รหัสด้านล่างแสดงให้เห็นถึงสไตล์ที่แตกต่างสำหรับทุกสี)
val sampleText = "This is a sample text"
enumValues<AnsiColor>().forEach { ansiColor ->
println("${ansiColor.regular}$sampleText${AnsiColor.RESET}")
println("${ansiColor.bold}$sampleText${AnsiColor.RESET}")
println("${ansiColor.underline}$sampleText${AnsiColor.RESET}")
println("${ansiColor.background}$sampleText${AnsiColor.RESET}")
println("${ansiColor.highIntensity}$sampleText${AnsiColor.RESET}")
println("${ansiColor.boldHighIntensity}$sampleText${AnsiColor.RESET}")
println("${ansiColor.backgroundHighIntensity}$sampleText${AnsiColor.RESET}")
}
หากใช้งานบน Windows ที่ไม่รองรับรหัส ANSI เหล่านี้การisCompatible
ตรวจสอบจะหลีกเลี่ยงปัญหาโดยการแทนที่รหัสด้วยสตริงว่าง