【问题标题】:Bold text through C++ write statement通过 C++ write 语句的粗体文本
【发布时间】:2013-05-16 14:47:58
【问题描述】:

我正在通过 telnet 处理字典服务器,我希望它以这种格式返回:

  **word** (wordType): wordDef wordDef wordDef wordDef
wordDef wordDef wordDef.

现在我正在输出代码:

write( my_socket, ("%s", word.data()    ), word.length()    ); // Bold this
write( my_socket, ("%s", theRest.data() ), theRest.length() );

所以我希望第一行加粗。

编辑

对不起,我忘了说这是一个命令行。

【问题讨论】:

  • 恐怕字体的样式不能通过套接字发送。为什么不使用像“This text is bold”这样的 HTML 语法,接收方会检查这些标签并采取相应的行动。
  • 嗯。它不会加粗代码 sn-p 中的文本。我应该在 Meta 上发布吗?

标签: c++ sockets networking formatting command-line-interface


【解决方案1】:

考虑使用VT100 escape sequences 之类的东西。由于您的服务器是基于 telnet 的,因此用户可能拥有支持各种终端模式的客户端。

例如,如果您想为 VT100 终端打开粗体,您将输出

ESC[1m

其中“ESC”是字符值 0x1b。切换回正常格式输出

ESC[0m

要在您的应用程序中使用它,您可以将示例行从您的问题更改为以下内容。

std::string str = "Hello!"
write( my_socket, "\x1b[1m", 4); // Turn on bold formatting
write( my_socket, str.c_str(), str.size()); // output string
write( my_socket, "\x1b[0m", 4); // Turn all formatting off

还有其他终端模式,例如 VT52、VT220 等。您可能需要考虑使用 ncurses,但如果您只需要简单的粗体开/关,它可能会有点繁重。

【讨论】:

  • 那到底应该怎么放进去呢? string bold("ESC[1m");?
  • @JShoe 大小是转义序列中的字符数,在这种情况下为 4 个字节。我已经用一些示例代码更新了我的答案。我建议将转义序列存储在 std::string 中,尽管为了简洁起见,我在示例中使用了 C 风格的字符串。
  • 谢谢,效果很好。我实际上已经厌倦了尝试write c++ 字符串,我制作了自己的包装器,在这里:gist.github.com/JoePShoulak/5592599
  • 由于函数不需要修改word,将其改为int Send(int socket, const string& word)。这将防止修改 word 并允许您将右值传递给 Send
  • 目前您正在通过值将字符串传递给Send。这意味着在调用Send 之前会创建字符串的副本。通过 const 引用传递消除了副本并允许您传递右值。您可以像以前一样执行std::string str; Send(sock, str);' or Send(sock, "hello");`,因为std::string 具有用于C 样式字符串的隐式转换构造函数。
猜你喜欢
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 2013-01-31
相关资源
最近更新 更多