在源文件中使用 Unicode 并且缺少 unicode 符号
Posted
技术标签:
【中文标题】在源文件中使用 Unicode 并且缺少 unicode 符号【英文标题】:Using Unicode in source files and and lack of unicode symbols 【发布时间】:2014-05-05 02:37:28 【问题描述】:自从我了解到 clang 能够编译用 Unicode 编写的 c++ 源文件后,我在编写与数学相关的代码时就开始大量使用它。比较
uₙ₊₁ᵖ = A*uₙ + B*uₙ₋₁;
uₙ₊₁ᶜ = π * Aₜₒₜ;
uₙ₊₁ = uₙ₊₁ᵖ + uₙ₊₁ᶜ;
和
u_n1_p = A*u_n + B*u_n_1;
u_n1_c = pi * A_tot;
u_n1 = u_n1_p + u_n1_c;
对我来说就像白天和黑夜一样:我只是通过阅读第一段代码就能理解它,而我根本不想阅读另一段代码
我知道 Python3 和 Ruby 允许使用 Unicode 源文件,所以这个功能似乎正在传播。
可以对这种做法提出异议:例如并非所有字体都支持这些字符,您的源文件取决于您使用的编码,并且您必须将 Unicode 字符从某处实际复制/粘贴(例如)到您的文本编辑器中。不过我觉得可读性的提升真的很大。
现在,正如您在 this page 上看到的那样,并非所有(甚至拉丁语)字母都可以在下标和上标中使用。更糟糕的是,这些绝对不是用于在源文件中编写数学的用途(请参阅here)
因此我的问题是:
您是否将 Unicode 用于与数学相关的代码?您如何看待这种用法?
有什么方法可以将字符转为下标或上标? (类似于组合用于变音符号的字符)
【问题讨论】:
至于 2。不。“上标”,正如您所理解的那样,是一个 属性。 Unicode 不“做”属性。它与变音符号不同(可能是您的键盘驱动程序允许输入基本字符,然后是重音符号,以获得重音符号)。 @Jongware :Unicode 块 U0300 包含“组合变音符号”。它们是向前面的基本字符添加变音符号的代码点。这与键盘驱动程序无关。 @MSalters。是的(但与问题无关,因为这并没有真正“组合”两个字符。这些字符设计为具有负宽度的字体,因此它们出现正确位置。此外,可识别 OpenType 的应用程序可以将这两个字符替换为单个设计的 glyph-with-accent。) 【参考方案1】:我会说不,除非
仅限内部代码,不会污染公共 API 整个团队都认为它有很大的好处 仅限数学密集型函数(不适用于相当琐碎的数学任务) 从业务逻辑/接口代码中分离出来 仅限于 unicode 的某些子集(可能只是下标和希腊符号)即使满足所有这些要求,我也会权衡使用的麻烦和增加的可读性,并倾向于坚持使用 ASCII。
确保您为团队提供严格的指导方针,说明何时可以接受,这样您就不会陷入每个for
循环都使用iₙ
的情况。
我的电脑似乎不喜欢您使用的“拉丁字母小写字母 N”(U+2099) 字符,只是将其呈现为一个大大降低可读性的框。确保您的工具/字体支持这种编辑方式。
PEP8 states unicode 字符不应该用于标准库中的标识符 - 他们可能有充分的理由。
总而言之-除非您有充分的理由,否则不要,然后仅在单独的数学密集型模块中。我想我可以确信它在某些情况下是有价值的。
【讨论】:
【参考方案2】:我对 OP 的问题是:ever since
有多长?
好问题。 Unicode 已经陪伴我们很长时间了,那么为什么要强制编程使用没有任何重音符号的美式 ASCII 呢?在工作和学习 C# 和 javascript 时,我发现这些语言可以识别 Unicode。 C# 在System.Math
中定义了两个有趣的常量:
// Represents the natural logarithmic base, specified by the constant, e.
public const double E = 2.7182818284590451;
// Represents the ..., specified by the constant, π.
public const double PI = 3.1415926535897931;
这里我们看到 π 的 unicode 注释,但没有 ℯ。如果同时拥有两个带有 unicode 标识符的常量,以便能够编写,那不是很好吗,例如:
double circumference = 2 * Math.π * r;
e 的情况很复杂,因为它经常与指数一起使用,在一行中总是难以表达。此外,对数基数 ℯ (U+212F) 和电子电荷℮ (U+212E) 的 unicode 表示是可疑的。我真的找不到关于基本费用的确切正确 unicode 的确认。
我猜这些常量并没有真正的 Unicode,除了通常的希腊字符,应该在 Unicode 希腊字母表中查找。
我对 System.Math 的结论是保留 ascii 标识符 E 和 PI,并添加 unicode 标识符 π。
至于 OP 问题 1,我还建议使用希腊字母表而不是强制使用变量进行数学运算,例如φ 到 phi,δ 到 delta 或 d,例如:
var x = 2 * π * sin(φ);
这样的代码绝对不会比 ascii 版本更难维护。
尽管我喜欢从 ascii 到 unicode 的技术进步,但我仍然建议使用简单的老式美式英语进行编程。西班牙语、匈牙利语的变量名称和 cmets,不,谢谢。对原始程序员来说也许不错,但它使协作变得更加困难。 (披露:我不是以英语为母语的人)而且,至少在 C# 和 Javascript 中,保留字只有英文:for
、if
、else
、...
所以:保持简单:希腊字母表的 unicode:是的,用于数学符号。多语言的 Unicode(口音):不,请使用英文。
超级/下标:实际上我觉得这是个好主意。我看到的问题在于复杂性:下标中的 n+1
旨在作为变量名的一部分,但看起来像 C#/C++ 操作。只是不要在名称中使用类似运算符的字形。
【讨论】:
以上是关于在源文件中使用 Unicode 并且缺少 unicode 符号的主要内容,如果未能解决你的问题,请参考以下文章
Qt写入unicode编码格式的文本(用QChar写入BOM标记,并且列出所有Qt支持的字符集)
有没有办法可以将 unicode 文本添加到 MBCS MFC 菜单