我不清楚在C的何处使用什么编码argv。我特别对以下情况感兴趣:

用户使用语言环境L1创建名称为N包含非ASCII字符的文件

稍后,用户使用区域设置L2在命令行上制表完成该文件的名称,该文件作为命令行参数输入到程序P中

P在命令行上看到什么字节序列?

我观察到在Linux上,在UTF-8语言环境中创建文件名,然后在(例如)zw_TW.big5语言环境中用Tab键完成该文件名似乎会使我的程序P喂UTF-8而不是UTF-8

Big5。但是,在OS X上,相同的一系列操作导致我的程序P获得Big5编码的文件名。

这是到目前为止我一直在想的事情(很长,我可能错了,需要纠正):

视窗

文件名以某种Unicode格式存储在磁盘上。因此Windows以这个名称命名N,从L1(当前代码页)转换为N我们将称为的Unicode版本N1,并存储N1在磁盘上。

然后,我 假设

发生的事情是,稍后稍后使用制表符补全时,该名称N1将转换为语言环境L2(新的当前代码页)以进行显示。运气好的话,这将产生原始名称N-但是,如果其中N包含L2中无法表示的字符,则该名称将不成立。我们叫新名字N2。

当用户实际按下Enter键以使用该参数运行P时,该名称N2将转换回Unicode,N1再次产生。这N1是通过在UCS2格式现在可供程序GetCommandLineW/

wmain/ tmain,但用户GetCommandLine/ main会看到的名称N2在当前区域设置(代码页)。

OS X

据我所知,磁盘存储的故事是相同的。OS X将文件名存储为Unicode。

对于Unicode终端,我 认为

发生的事情是该终端在Unicode缓冲区中构建了命令行。因此,完成制表符后,它会将文件名作为Unicode文件名复制到该缓冲区。

当您运行命令时,该Unicode缓冲区将转换为当前语言环境L2,并通过馈入程序argv,并且程序可以将具有当前语言环境的argv解码为Unicode以显示。

的Linux

在Linux上,一切都不同,我对正在发生的事情感到困惑。Linux将文件名存储为 字节字符串

,而不是Unicode。因此,如果您N在区域设置L1中创建名称为文件的文件,则该文件N作为字节字符串存储在磁盘上。

当我稍后运行终端并尝试用Tab键完成名称时,我不确定会发生什么。在我看来,命令行被构造为字节缓冲区,而文件名 作为字节字符串

被串联到该缓冲区上。我假设当您键入标准字符时,它会即时编码为附加到该缓冲区的字节。

当您运行程序时,我认为缓冲区直接发送到argv。现在,有什么编码argv?在语言环境L2中,您在命令行中键入的任何字符看起来都将采用L2编码,但是

文件名将采用L1编码 。因此argv包含两种编码的混合!

如果有人能让我知道这里发生了什么,我真的很喜欢。我目前所拥有的只是半猜测和猜测,而且并不能真正融合在一起。我真正想要成为现实的是要argv在当前代码页(Windows)或当前语言环境(Linux

/ OS X)中进行编码,但事实并非如此……

附加功能

这是一个简单的候选程序P,它使您可以自己观察编码:

#include

int main(int argc, char **argv)

{

if (argc < 2) {

printf("Not enough arguments\n");

return 1;

}

int len = 0;

for (char *c = argv[1]; *c; c++, len++) {

printf("%d ", (int)(*c));

}

printf("\nLength: %d\n", len);

return 0;

}

您可以locale -a用来查看可用的语言环境,也可以export LC_ALL=my_encoding用来更改您的语言环境。

java argv_argv的编码是什么?相关推荐

  1. 【错误记录】生成 Java 文档错误 ( Xxx.java:xx: 错误: 编码GBK的不可映射字符 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 使用 javadoc 命令 , 生成 Java 文档 , 报错 ; javadoc Student.java D:\develop\javadoc& ...

  2. Java Web安全编码

    JAVA Web安全编码规范要求 Java Web安全编码 输入输出数据验证 身份认证和访问控制 文件和资源管理 会话管理 错误和异常信息处理 数据加密 代码质量 序列化 本文转载,如有冒犯请联系本人 ...

  3. 如何理解java采用Unicode编码

    http://blog.csdn.net/gjb724332682/article/details/43229563 Java中字符仅以一种形式存在,那就是Unicode.由于java采用unicod ...

  4. java改变变量编码方式_Java 10将如何改变您的编码方式

    java改变变量编码方式 突出显示Java 10中新的Java局部变量类型推断功能 早在2016年,Java社区就掀起了新的JDK增强提案(JEP): JEP 286 . 现在,两年后,局部变量类型推 ...

  5. java改变变量编码方式_Java 8中的5个功能将改变您的编码方式

    java改变变量编码方式 Java 8在JVM和语言级别都包含了一些非常令人兴奋的功能. 尽管最初为该发行版设想的某些功能已扩展到第9版,或已推出第9版,但实际上有数十个新功能. 许多新添加的内容在编 ...

  6. java字符集编码是,java字符集与编码有关问题

    java字符集与编码问题 没想到自己的第一篇javaeye博客就是让人头痛的java字符集转码问题,下面是我个人的一些认识与网上收集的代码.在java中String在JVM里是unicode的,任何b ...

  7. java中编码问题_[干货预警]一次搞懂Java中的编码问题

    编码问题一直是一个困扰程序员的问题,尤其是对于java程序员.因为java的跨平台特性,经常需要在多个编码之间进行转换. 下面详细讲一讲java中的编码问题 一.为什么要编码 长话短说,原因如下: 1 ...

  8. java 字符串的编码与C#的区别

    java 字符串的编码与C#的区别 1, 字符串 转换为字节数组 时的区别. JAVA: 当我们使用方法 getBytes() 转换为byte数组时 如: 使用UTF-8 时: String str= ...

  9. java菱形乱码 编码_【分享】Java开发过程中中文乱码问题总结

    一.文件乱码处理 1.文件默认编码:默认使用项目的默认编码 右击文件->Properties->Resource->Text file encoding 2.JSP文件编码:由于JS ...

最新文章

  1. Node提示:error code Z_BUF_ERROR,error error -5,error zlib:unexpected end of file
  2. Unity3d Time的使用
  3. java date不要秒_java – 比较日期忽略Joda中DateTime的秒和毫秒时刻
  4. linux打包cpio命令例子,linux压缩命令——tar、cpio详解
  5. java指令导出data文件_直接用 java 命令行动态生成jpg文件 (转)
  6. 国内外大厂集结,远程办公大考成绩单发布!
  7. 物流系统车辆仓库定位的实现——基于RFID定位的实现方法
  8. iOS开发 -------- Block技术中的weak - strong
  9. CAD中插入外部参照字体会变繁体_什么是CAD的形文件,它与字体文件有什么区别?...
  10. maven环境setting配置文件详解
  11. laravel与thinkphp相比有哪些优势?他们之间的区别/优缺点在哪
  12. 软件项目管理资料题目
  13. “Flash闪存”基础 及 “SD NAND Flash”产品的测试
  14. 联合概率 条件概率 边缘概率之间关系
  15. 程序员应该如何培养自己的人脉关系
  16. 如何从ST官网下载STM32标准库
  17. WPJAM「网址导航」:最轻便快捷的WordPress网址导航插件
  18. python 老男孩全套教程-老男孩全栈python视频教程104天【百度网盘】
  19. win10任务栏图标两个以上不显示缩略图且不显示桌面预览解决方案
  20. 小程序setData报错未定义

热门文章

  1. 地图距离算法_基于权重的地图匹配技术
  2. 漫画算法python版下载_用 Python 下载漫画
  3. 整理了js数组去重4种方法
  4. Express初级学习
  5. 奥鹏19春计算机应用基础,19春西南交《计算机应用基础》在线作业二(答案)-...
  6. 计算机网络期末复习资料
  7. docker 进入容器
  8. FPGA--------随笔总结(持续更新)
  9. perf in linux,[Package Request] 仓库请添加 linux-perf-5.4
  10. Java中的委托模式