388 lines
18 KiB
HTML
388 lines
18 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>字符集与编码</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_language_charset skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">字符集与编码</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-language.html">language</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<h3><span class="mw-headline" id=".E5.BD.93.E5.89.8D.E5.AD.97.E7.AC.A6.E9.9B.86_.28C.2B.2B23_.E8.B5.B7.29">当前字符集 <span class="t-mark-rev t-since-cxx23">(C++23 起)</span></span></h3>
|
|
<h4><span class="mw-headline" id=".E7.BF.BB.E8.AF.91.E5.AD.97.E7.AC.A6.E9.9B.86">翻译字符集</span></h4>
|
|
<p><i>翻译字符集</i> 含有以下元素:</p>
|
|
<ul>
|
|
<li>每个由 ISO/IEC 10646 命名的字符,通过它独特的 UCS 标量值标识,和</li>
|
|
<li>没有赋予命名字符的 UCS 标量对应的每个不同的字符</li>
|
|
</ul>
|
|
<h4><span class="mw-headline" id=".E5.9F.BA.E7.A1.80.E5.AD.97.E7.AC.A6.E9.9B.86">基础字符集</span></h4>
|
|
<p><i>基础字符集</i> 是翻译字符集的一个子集,它含有以下96个字符:</p>
|
|
<table class="wikitable" style="text-align: left;">
|
|
<tr>
|
|
<th>代码单元</th>
|
|
<th>字符</th>
|
|
<th>字形</th>
|
|
</tr>
|
|
<tr>
|
|
<td>U+0009</td>
|
|
<td>横向制表</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+000B</td>
|
|
<td>纵向制表</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+000C</td>
|
|
<td>换页(FF)</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+0020</td>
|
|
<td>空格</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+000A</td>
|
|
<td>换行(LF)</td>
|
|
<td>新行</td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+0021</td>
|
|
<td>感叹号</td>
|
|
<td><code><b>!</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+0022</td>
|
|
<td>问号</td>
|
|
<td><code><b>"</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+0023</td>
|
|
<td>数字符号</td>
|
|
<td><code><b>#</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+0025</td>
|
|
<td>百分号</td>
|
|
<td><code><b>%</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+0026</td>
|
|
<td>和号</td>
|
|
<td><code><b>&</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+0027</td>
|
|
<td>撇号</td>
|
|
<td><code><b>'</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+0028</td>
|
|
<td>左圆括号</td>
|
|
<td><code><b>(</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+0029</td>
|
|
<td>右圆括号</td>
|
|
<td><code><b>)</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+002A</td>
|
|
<td>星号</td>
|
|
<td><code><b>*</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+002B</td>
|
|
<td>加号</td>
|
|
<td><code><b>+</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+002C</td>
|
|
<td>逗号</td>
|
|
<td><code><b>,</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+002D</td>
|
|
<td>连字符/减号</td>
|
|
<td><code><b>-</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+002E</td>
|
|
<td>句号</td>
|
|
<td><code><b>.</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+002F</td>
|
|
<td>斜线</td>
|
|
<td><code><b>/</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+0030 .. U+0039</td>
|
|
<td>数位 零到九</td>
|
|
<td><code><b>0 1 2 3 4 5 6 7 8 9</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+003A</td>
|
|
<td>冒号</td>
|
|
<td><code><b>:</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+003B</td>
|
|
<td>分号</td>
|
|
<td><code><b>;</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+003C</td>
|
|
<td>小于号</td>
|
|
<td><code><b><</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+003D</td>
|
|
<td>等号</td>
|
|
<td><code><b>=</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+003E</td>
|
|
<td>大于号</td>
|
|
<td><code><b>></b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+003F</td>
|
|
<td>问号</td>
|
|
<td><code><b>?</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+0041 .. U+005A</td>
|
|
<td>拉丁大写字母 A到Z</td>
|
|
<td><code><b>A B C D E F G H I J K L M</b></code>
|
|
<p><code><b>N O P Q R S T U V W X Y Z</b></code></p>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+005B</td>
|
|
<td>左方括号</td>
|
|
<td><code><b>[</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+005C</td>
|
|
<td>反斜线</td>
|
|
<td><code><b>\</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+005D</td>
|
|
<td>右方括号</td>
|
|
<td><code><b>]</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+005E</td>
|
|
<td>抑扬音符号</td>
|
|
<td><code><b>^</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+005F</td>
|
|
<td>下划线</td>
|
|
<td><code><b>_</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+0061 .. U+007A</td>
|
|
<td>拉丁小写字母 a到z</td>
|
|
<td><code><b>a b c d e f g h i j k l m</b></code>
|
|
<p><code><b>n o p q r s t u v w x y z</b></code></p>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+007B</td>
|
|
<td>左波形括号</td>
|
|
<td><code><b>{</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+007C</td>
|
|
<td>竖线</td>
|
|
<td><code><b>|</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+007D</td>
|
|
<td>右波形括号</td>
|
|
<td><code><b>}</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+007E</td>
|
|
<td>波浪符</td>
|
|
<td><code><b>~</b></code></td>
|
|
</tr>
|
|
</table>
|
|
<h4><span class="mw-headline" id=".E5.9F.BA.E7.A1.80.E5.AD.97.E9.9D.A2.E9.87.8F.E5.AD.97.E7.AC.A6.E9.9B.86">基础字面量字符集</span></h4>
|
|
<p><i>基础字面量字符集</i> 含有基础字符集的所有字符,外加以下控制字符:</p>
|
|
<table class="wikitable" style="text-align: left;">
|
|
<tr>
|
|
<th>代码单元</th>
|
|
<th>字符</th>
|
|
</tr>
|
|
<tr>
|
|
<td>U+0000</td>
|
|
<td>空</td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+0007</td>
|
|
<td>响铃</td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+0008</td>
|
|
<td>退格</td>
|
|
</tr>
|
|
<tr>
|
|
<td>U+000D</td>
|
|
<td>回车(CR)</td>
|
|
</tr>
|
|
</table>
|
|
<h4><span class="mw-headline" id=".E6.89.A7.E8.A1.8C.E5.AD.97.E7.AC.A6.E9.9B.86">执行字符集</span></h4>
|
|
<p><i>执行字符集</i> 和 <i>执行宽字符集</i> 是基础字面量字符集的超集。执行字符集的编码和额外元素(如果存在)的集合受地区设定影响。</p>
|
|
<h4><span class="mw-headline" id=".E4.BB.A3.E7.A0.81.E5.8D.95.E5.85.83.E4.B8.8E.E5.AD.97.E9.9D.A2.E9.87.8F.E7.BC.96.E7.A0.81">代码单元与字面量编码</span></h4>
|
|
<p><i>代码单元</i> 是字符类型的一个整数值。在除了多字符和不可编码字符字面量以外的<a href="cpp-language-character_literal.html">字符字面量</a>中的字符,和在<a href="cpp-language-string_literal.html">字符串字面量</a>中的字符会以编码前缀被编码为一个含有一个或多个编码单元的序列,这被称为对应的 <i>字面量编码</i>。</p>
|
|
<p>字面量编码或执行字符集的受地区设定影响的编码会将基础字面量字符集的每个元素编码为一个具有非负值的代码单元,而且它与其他任何元素编码的代码单元都不相同。基础字面量字符集以外的字符可以被编码为多个代码单元;这样编码出来的某个编码单元可以和基础字面量字符集中的字符编码的编码单元一致。执行字符集的编码可以和任何字面量编码都不相关。</p>
|
|
<p>通常字面量编码是应用到通常字符字面量和通常字符串字面量的编码。宽字面量编码是应用到宽字符字面量和宽字符串字面量的编码。</p>
|
|
<p>U+0000 会被编码为零值。翻译字符集的其他任何元素都不能被编码为具有零值的代码单元。每个数位零(U+0030)后的数位字符的代码单元值都应该比上一个字符的值大一。 通常字面量编码和宽字面量编码的其他部分都由实现定义。</p>
|
|
<p>对于 UTF-8,UTF-16 和 UTF-32 字面量,翻译字符集中每个字符对应的 UCS 标量值都会以 ISO/IEC 10646 中分别对应的 UCS 编码形式的说明进行编码。</p>
|
|
<h3><span class="mw-headline" id="C.2B.2B23_.E5.89.8D.E7.9A.84.E5.AD.97.E7.AC.A6.E9.9B.86_.28C.2B.2B23_.E5.89.8D.29">C++23 前的字符集 <span class="t-mark-rev t-until-cxx23">(C++23 前)</span></span></h3>
|
|
<h4><span class="mw-headline" id=".E5.9F.BA.E7.A1.80.E6.BA.90.E5.AD.97.E7.AC.A6.E9.9B.86">基础源字符集</span></h4>
|
|
<p><i>基础源字符集</i> 含有以下96个字符:</p>
|
|
<ul>
|
|
<li>空格字符,</li>
|
|
<li>表示以下内容的控制字符:
|
|
<ul>
|
|
<li>横向制表符,</li>
|
|
<li>纵向制表符,</li>
|
|
<li>换页,</li>
|
|
<li>以及换行,</li>
|
|
</ul>
|
|
</li>
|
|
<li>外加以下91个图形字符:</li>
|
|
</ul>
|
|
<table class="wikitable" style="text-align: center;">
|
|
<tr>
|
|
<td><code>a</code></td>
|
|
<td><code>b</code></td>
|
|
<td><code>c</code></td>
|
|
<td><code>d</code></td>
|
|
<td><code>e</code></td>
|
|
<td><code>f</code></td>
|
|
<td><code>g</code></td>
|
|
<td><code>h</code></td>
|
|
<td><code>i</code></td>
|
|
<td><code>j</code></td>
|
|
<td><code>k</code></td>
|
|
<td><code>l</code></td>
|
|
<td><code>m</code></td>
|
|
<td><code>n</code></td>
|
|
<td><code>o</code></td>
|
|
<td><code>p</code></td>
|
|
<td><code>q</code></td>
|
|
<td><code>r</code></td>
|
|
<td><code>s</code></td>
|
|
<td><code>t</code></td>
|
|
<td><code>u</code></td>
|
|
<td><code>v</code></td>
|
|
<td><code>w</code></td>
|
|
<td><code>x</code></td>
|
|
<td><code>y</code></td>
|
|
<td><code>z</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>A</code></td>
|
|
<td><code>B</code></td>
|
|
<td><code>C</code></td>
|
|
<td><code>D</code></td>
|
|
<td><code>E</code></td>
|
|
<td><code>F</code></td>
|
|
<td><code>G</code></td>
|
|
<td><code>H</code></td>
|
|
<td><code>I</code></td>
|
|
<td><code>J</code></td>
|
|
<td><code>K</code></td>
|
|
<td><code>L</code></td>
|
|
<td><code>M</code></td>
|
|
<td><code>N</code></td>
|
|
<td><code>O</code></td>
|
|
<td><code>P</code></td>
|
|
<td><code>Q</code></td>
|
|
<td><code>R</code></td>
|
|
<td><code>S</code></td>
|
|
<td><code>T</code></td>
|
|
<td><code>U</code></td>
|
|
<td><code>V</code></td>
|
|
<td><code>W</code></td>
|
|
<td><code>X</code></td>
|
|
<td><code>Y</code></td>
|
|
<td><code>Z</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>0</code></td>
|
|
<td><code>1</code></td>
|
|
<td><code>2</code></td>
|
|
<td><code>3</code></td>
|
|
<td><code>4</code></td>
|
|
<td><code>5</code></td>
|
|
<td><code>6</code></td>
|
|
<td><code>7</code></td>
|
|
<td><code>8</code></td>
|
|
<td><code>9</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>_</code></td>
|
|
<td><code>{</code></td>
|
|
<td><code></code>}</td>
|
|
<td><code>[</code></td>
|
|
<td><code>]</code></td>
|
|
<td><code>#</code></td>
|
|
<td><code>(</code></td>
|
|
<td><code>)</code></td>
|
|
<td><code><</code></td>
|
|
<td><code>></code></td>
|
|
<td><code>%</code></td>
|
|
<td><code>:</code></td>
|
|
<td><code>;</code></td>
|
|
<td><code>.</code></td>
|
|
<td><code>?</code></td>
|
|
<td><code>*</code></td>
|
|
<td><code>+</code></td>
|
|
<td><code>-</code></td>
|
|
<td><code>/</code></td>
|
|
<td><code>^</code></td>
|
|
<td><code>&</code></td>
|
|
<td><code>|</code></td>
|
|
<td><code>~</code></td>
|
|
<td><code>!</code></td>
|
|
<td><code>=</code></td>
|
|
<td><code>,</code></td>
|
|
<td><code>\</code></td>
|
|
<td><code>"</code></td>
|
|
<td><code>’</code></td>
|
|
</tr>
|
|
</table>
|
|
<p>基础源字符集的成员的字形是为了标识 ISO/IEC 10646 中对应 ASCII 字符集的子集的字符。然而由于从源文件的字符到源字符集的映射(在<a href="cpp-language-translation_phases.html#.E9.98.B6.E6.AE.B5_1">翻译阶段1</a>中所述)由实现决定,因此实现需要在其文档记载基础源字符如何在源文件里表示。</p>
|
|
<h4><span class="mw-headline" id=".E5.9F.BA.E7.A1.80.E6.89.A7.E8.A1.8C.E5.AD.97.E7.AC.A6.E9.9B.86">基础执行字符集</span></h4>
|
|
<p><i>基础执行字符集</i> 和 <i>基础执行宽字符集</i> 包含基础源字符集的所有成员,外加表示警报(响铃),退格和回车的控制字符,以及值为 0 的空字符(对应的有空宽字符)。</p>
|
|
<p>对于每个基础执行字符集,成员的值均不得为负,且各不相同。在基础源字符集和基础执行字符集中,在上述列表中的数位列表里每个 0 之后的字符的值都应该比上一个字符的值大一。</p>
|
|
<h4><span class="mw-headline" id=".E6.89.A7.E8.A1.8C.E5.AD.97.E7.AC.A6.E9.9B.86.EF.BC.88.E6.97.A7.E5.AE.9A.E4.B9.89.EF.BC.89">执行字符集(旧定义)</span></h4>
|
|
<p><i>执行字符集</i> 和 <i>执行宽字符集</i> 分别是基础执行字符集和基础执行宽字符集的由实现定义的超集。执行字符集的成员的值和额外成员的集合受地区设定影响。</p>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td colspan="2"><a href="cpp-language-ascii.html">ASCII 码表</a></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|