Giải pháp thay thế cho các ứng dụng được viết bằng C11 hoặc C++ 11 là sử dụng ký tự Unicode combining long stroke overlay.
Trong C++ 11 bạn có thể viết mã một cái gì đó như thế này:
#include <iostream>
#include <string>
std::string strikethrough(const std::string& text) {
std::string result;
for (auto ch : text) {
result.append(u8"\u0336");
result.push_back(ch);
}
return result;
}
int main() {
std::cout << strikethrough("strikethrough") << std::endl;
}
Mã tiền tố mỗi nhân vật trong các đầu vào text
với lớp phủ đột quỵ \u0336
. Lưu ý rằng hàm giả định rằng text
được mã hóa bằng mã hóa một byte như ASCII hoặc Latin. Nếu đầu vào nằm trong UTF-8, nó phải được chuyển đổi thành UTF-32 trước tiên để có được ranh giới ký tự.
Kết quả sau đó là s̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h
trong thiết bị đầu cuối có khả năng UTF-8. Tôi không biết tại sao nhân vật đầu tiên không có cảnh cáo, phải là vấn đề đầu cuối. Tôi có thể giải quyết vấn đề này bằng cách in ít nhất một ký tự trước cuộc gọi hàm strikethrough.
Giải pháp Unicode cũng tạo ra một khóa hơi khác trong thiết bị đầu cuối của tôi (terminator
) so với trình tự thoát ANSI được đề cập ở trên. Cái trước ám dòng chính xác ở giữa của văn bản trong khi sau này ám nó một chút dưới đây.
Nguồn
2015-10-15 17:04:33
My 'libvterm' /' pangoterm' có thể làm tốt. Xem ảnh chụp màn hình thứ hai trong [link] (http://leonerds-code.blogspot.com/2011/09/libvtermpangoterm-and-tickit.html) – LeoNerd
Trên thực tế một bộ tốt của thiết bị đầu cuối vỏ chính dường như hỗ trợ nó (điều này bao gồm '' guake'', '' terminator'', '' gnome-terminal'', ...). http://misc.flogisoft.com/bash/tip_colors_and_formatting#terminals_compatibility. Kiểm tra nhanh: '' echo -e "\ e [9mtest \ e [0m" ''. – vaab