显示所有 ASCII 代码的文字字符

问题描述 投票:0回答:1

在我的 C++ 课程中遇到挑战问题。 目标是输出 0-127 之间的所有 ASCII 字符,每行 16 个字符。

我们遇到的问题是某些字符,例如 10 ( )正在做他们应该做的事情而不是显示“ ”。我的导师也不知道这个问题的解决办法。

这就是我所拥有的:

int main ()
{
    for (int i = 0; i <= 127; i++) {
        cout << setw(4) << i << ": " << (char)i << "  ";
        
        if ((i + 1) % 16 == 0) {
            cout << endl;
            // Not sure why this doesn't seem to be displaying correctly? Possibly it's because of what some of the earlier ascii characters do/are
        }
    }

    return 0;
}

我们找到了一些可能的解决方案,包括 Raw,它似乎不适用于变量。 也没有设法让 fprint 为它工作

c++ formatting char
1个回答
0
投票

现代终端的工作方式与旧式 DOS 终端不同。您不能只将控制字符代码写入视频内存并使其字形出现在屏幕上。

相反,您必须将 Unicode 值写入显示屏。如果您使用 UTF-8,您可以让它在 Windows 和 *nixen 上都能很好地工作。

#include <iomanip>
#include <iostream>

#ifdef _WIN32
  #include <windows.h>
  
  struct OutputCodePage
  {
    UINT original_cp;
    OutputCodePage( UINT cp ) : original_cp{GetConsoleOutputCP()} { SetConsoleOutputCP( cp ); }
   ~OutputCodePage() { SetConsoleOutputCP( original_cp ); }
  };
  
  OutputCodePage output_code_page( CP_UTF8 );
#endif

const char * CP437[] =  // 0 (nul) --> 32 (space)
{
  " ", "☺", "☻", "♥", "♦", "♣", "♠", "•", "◘", "○", "◙", "♂", "♀", "♪", "♫", "☼",
  "►", "◄", "↕", "‼", "¶", "§", "▬", "↨", "↑", "↓", "→", "←", "∟", "↔", "▲", "▼",
  " ", "!", "\"","#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/",
  "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?",
  "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O",
  "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\"","]", "^", "_",
  "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
  "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "⌂",
  "Ç", "ü", "é", "â", "ä", "à", "å", "ç", "ê", "ë", "è", "ï", "î", "ì", "Ä", "Å",
  "É", "æ", "Æ", "ô", "ö", "ò", "û", "ù", "ÿ", "Ö", "Ü", "¢", "£", "¥", "₧", "ƒ",
  "á", "í", "ó", "ú", "ñ", "Ñ", "ª", "º", "¿", "⌐", "¬", "½", "¼", "¡", "«", "»",
  "░", "▒", "▓", "│", "┤", "╡", "╢", "╖", "╕", "╣", "║", "╗", "╝", "╜", "╛", "┐",
  "└", "┴", "┬", "├", "─", "┼", "╞", "╟", "╚", "╔", "╩", "╦", "╠", "═", "╬", "╧",
  "╨", "╤", "╥", "╙", "╘", "╒", "╓", "╫", "╪", "┘", "┌", "█", "▄", "▌", "▐", "▀",
  "α", "ß", "Γ", "π", "Σ", "σ", "µ", "τ", "Φ", "Θ", "Ω", "δ", "∞", "φ", "ε", "∩",
  "≡", "±", "≥", "≤", "⌠", "⌡", "÷", "≈", "°", "∙", "·", "√", "ⁿ", "²", "■", "\xA0"
};


int main()
{
  std::cout << "  +  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15\n";
  for (int y = 0;  y < 16;  y++)
  {
    std::cout << std::setw(3) << (y * 16);
    for (int x = 0;  x < 16;  x++)
    {
      std::cout << "  " << CP437[y * 16 + x];
    }
    std::cout << "\n";
  }
}

这会让你:

  +  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
  0     ☺  ☻  ♥  ♦  ♣  ♠  •  ◘  ○  ◙  ♂  ♀  ♪  ♫  ☼
 16  ►  ◄  ↕  ‼  ¶  §  ▬  ↨  ↑  ↓  →  ←  ∟  ↔  ▲  ▼
 32     !  "  #  $  %  &  '  (  )  *  +  ,  -  .  /
 48  0  1  2  3  4  5  6  7  8  9  :  ;  <  =  >  ?
 64  @  A  B  C  D  E  F  G  H  I  J  K  L  M  N  O
 80  P  Q  R  S  T  U  V  W  X  Y  Z  [  "  ]  ^  _
 96  `  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o
112  p  q  r  s  t  u  v  w  x  y  z  {  |  }  ~  ⌂
128  Ç  ü  é  â  ä  à  å  ç  ê  ë  è  ï  î  ì  Ä  Å
144  É  æ  Æ  ô  ö  ò  û  ù  ÿ  Ö  Ü  ¢  £  ¥  ₧  ƒ
160  á  í  ó  ú  ñ  Ñ  ª  º  ¿  ⌐  ¬  ½  ¼  ¡  «  »
176  ░  ▒  ▓  │  ┤  ╡  ╢  ╖  ╕  ╣  ║  ╗  ╝  ╜  ╛  ┐
192  └  ┴  ┬  ├  ─  ┼  ╞  ╟  ╚  ╔  ╩  ╦  ╠  ═  ╬  ╧
208  ╨  ╤  ╥  ╙  ╘  ╒  ╓  ╫  ╪  ┘  ┌  █  ▄  ▌  ▐  ▀
224  α  ß  Γ  π  Σ  σ  µ  τ  Φ  Θ  Ω  δ  ∞  φ  ε  ∩
240  ≡  ±  ≥  ≤  ⌠  ⌡  ÷  ≈  °  ∙  ·  √  ⁿ  ²  ■  �

请记住,从 0..31(以及 126 之后的内容)开始的所有内容不一定是单个字符。在 UTF-8 中,每个“字符”都是一个string。这就是源代码中使用双引号的原因。

附注正如您所看到的,这是代码页 437 — 类似 DOS 终端显示的旧标准。如果您希望显示其他代码页的值,则必须调整字符串数组。

P.P.S。如果您只想将

int
显示为
char
,那么您必须坚持使用可显示字符:32..126.

  std::cout << (char)65 << ...;  // prints “A“
© www.soinside.com 2019 - 2024. All rights reserved.