- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在像这样的语句中,两者都使用相同的编码 (UTF-8) 输入到源代码中,并且语言环境设置正确,它们之间有什么实际区别吗?
printf("ο Δικαιοπολις εν αγρω εστιν\n");
printf("%ls", L"ο Δικαιοπολις εν αγρω εστιν\n");
因此,在进行输出时是否有任何理由偏爱其中一个?我想第二个表现会差一点,但它比多字节文字有任何优势(或劣势)吗?
编辑:这些字符串打印没有问题。但我没有使用宽字符串函数,因为我也希望能够使用 printf
等。所以问题是这些打印方式是否有任何不同(鉴于上述情况),如果有,第二种有什么优势吗?
EDIT2:根据下面的评论,我现在知道这个程序有效——我认为这是不可能的:
int main()
{
setlocale(LC_ALL, "");
wprintf(L"ο Δικαιοπολις εν αγρω εστιν\n"); // wide output
freopen(NULL, "w", stdout); // lets me switch
printf("ο Δικαιοπολις εν αγρω εστιν\n"); // byte output
}
EDIT3:我通过查看这两种类型的情况做了一些进一步的研究。取一个更简单的字符串:
wchar_t *wides = L"£100 π";
char *mbs = "£100 π";
编译器正在生成不同的代码。宽字符串是:
.string "\243"
.string ""
.string ""
.string "1"
.string ""
.string ""
.string "0"
.string ""
.string ""
.string "0"
.string ""
.string ""
.string " "
.string ""
.string ""
.string "\300\003"
.string ""
.string ""
.string ""
.string ""
.string ""
第二个是:
.string "\302\243100 \317\200"
看看 Unicode 编码,第二种是纯 UTF-8。宽字符表示是 UTF-32。我意识到这将取决于实现。
所以也许文字的宽字符表示更便携?我的系统不会直接打印UTF-16/UTF-32编码,所以会自动转换成UTF-8输出。
最佳答案
printf("ο Δικαιοπολις εν αγρω εστιν\n");
打印字符串文字(const char*
,特殊字符表示为多字节 字符)。虽然您可能会看到正确的输出,但在处理诸如此类的非 ASCII 字符时,您可能还会遇到其他问题。例如:
char str[] = "αγρω";
printf("%d %d\n", sizeof(str), strlen(str));
输出 9 8
,因为这些特殊字符中的每一个都由 2 个 char
表示。
当使用 L
前缀时,您的文字包含宽字符 (const wchar_t*
) 和 %ls
格式说明符导致这些宽要转换为多字节字符 (UTF-8) 的字符。请注意,在这种情况下,应适当设置语言环境,否则此转换可能会导致输出无效:
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(void)
{
setlocale(LC_ALL, "");
printf("%ls", L"ο Δικαιοπολις εν αγρω εστιν");
return 0;
}
但是,虽然在使用宽字符时有些事情可能会变得更加复杂,但其他事情可能会变得更加简单和直接。例如:
wchar_t str[] = L"αγρω";
printf("%d %d", sizeof(str) / sizeof(wchar_t), wcslen(str));
将输出 5 4
正如人们自然期望的那样。
一旦您决定使用宽字符串,wprintf
可用于直接打印宽字符。此处还值得注意的是,在 Windows 控制台的情况下,stdout
的转换模式应通过调用 _setmode
显式设置为 Unicode 模式之一。 :
#include <stdio.h>
#include <wchar.h>
#include <io.h>
#include <fcntl.h>
#ifndef _O_U16TEXT
#define _O_U16TEXT 0x20000
#endif
int main()
{
_setmode(_fileno(stdout), _O_U16TEXT);
wprintf(L"%s\n", L"ο Δικαιοπολις εν αγρω εστιν");
return 0;
}
关于c - 使用 printf 打印 UTF-8 字符串 - 宽字符串文字与多字节字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15528359/
函数参数中或显示尺寸时(高度,宽度)的顺序是否有约定? 最佳答案 我不知道大量的语言,但我使用过的语言(宽度,高度)。它更适合沿着 (x, y) 坐标线。 关于language-agnostic -
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
有没有办法显示自定义宽度/高度的YouTube视频? 最佳答案 在YouTube网站上的this link中: You can resize the player by editing the obj
如何从此表单获取数据(数据的长表示): import pandas as pd df = pd.DataFrame({ 'c0': ['A','A','B'], 'c1': ['b',
我在让宽度为 900px 的页面在宽度低于 900px 的分辨率下看起来不错时遇到了一些麻烦。这包括智能手机等移动设备。看起来我在页面上放大了,但无法滚动或缩小。我的页面包装器被定义为以屏幕为中心。这
我有一个包含一个表的 div,它有另一个带有动态变化文本的 div。div 有样式 overflow: hidden; white-space: nowrap; text-overflow: elli
我一直在愚弄下面的html代码。我已将 div id ="mainWide"设置为 2500 像素的宽度,这比我的屏幕还宽,我希望在主浏览器窗口中有一个水平滚动条,而不是在 div block 本身中
当我的屏幕浏览器窗口在 992px-1199px 之间时,我的文章元素比它们的父 div (.wrapper) 更宽。所以在这个屏幕宽度下,面板重叠并且看起来不对。 在所有其他屏幕宽度下,我的代码都准
我在对齐某些行时遇到了一些问题。我正在显示一个占据视口(viewport) 100% 高度的部分。因此,当您在屏幕上查看此部分时,您只会看到此部分。 在这个部分中,我有一个标题和副标题。标题应显示在节
为什么表单输入字段比其父 div 宽?宽度应用于文本 div,但不应用于其中包含表单字段的 div。为什么会这样? See the livecode here. .parent { width:
我想让这个标题 100% 宽。我在 jsfiddle 上试过这个,但是左边和右边还有一些余量。 CSS: #header { background: url("../img/top-bg.png
我的页面宽度有问题。无论我尝试什么,它的左边或右边都有白边(默认情况下在右边,如果我使用 margin-right:0 则在左边)。如果我使用 margin:0 比它留在右边。尝试了我所知道的一切,但
我有一个带有背景图片的宽 div。 div 的宽度为 1100 像素,当浏览器窗口小于该宽度时,会出现滚动条。有什么办法可以避免滚动条吗?那不是任何黑客。现在我知道我可以把它放在 body image
我有一个您可以访问的应用程序 here .当您打开应用程序时,只需单击加号按钮,您就会看到一个带有搜索栏的模态窗口。 现在请执行这两个搜索: 搜索 1:AAA 搜索 2:AAE 您会看到,在 AAE
这个问题在这里已经有了答案: Does element width include padding? (5 个答案) 关闭 7 年前。 HTML CSS .wrap{widt
我正在尝试在工具栏中创建一个自定义显示,类似于 Xcode 工具栏中心的信息 Pane 。 我们如何创建一个宽度超过 32 点的 NSToolbarItem? 框架始终将其限制为 32 点,即使最小和
我想将df1转换成df2 旧示例数据框 df1 df1 长),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/359
我正在使用 JavaScript 代码在 FireBase/FireStore 中上传图像。 核心功能已经可以运行,我可以上传,但我还需要在上传之前检查图像的大小。这就是我很乐意获得帮助的地方。 以下
如何在 Tkinter 中设置/更改 ttk.Separator 对象的长度/宽度? ttk.Separator(self, orient='horizontal').grid(c
我有一个简单的问题。为什么 a 不会自动调整其内容的大小?像这样: Test 返回 width:100%,尽管我希望“Test”这个词简单地居中。有什么想法吗? 最佳答案 您的问题与 HT
我是一名优秀的程序员,十分优秀!