unicode标准有足够的代码点,你需要4个字节来存储它们。 这就是UTF-32编码所做的。 然而,UTF-8编码以某种方式通过使用称为“可变宽度编码”的东西将它们挤压到更小的空间中。 实际上,它只是用一个字节表示US-ASCII的前127个字符,看起来就像真正的ASCII,所以你可以把许多ASCII文本解释为UTF-8,而不用做任何事情。 整洁的把戏。 那么它是怎样工作的? 我要在这里问一问,回答我自己的问题,因为我只是做了一些解读,我认为这可能会让别人省下一些时间。 另外也许有人可以纠正我,如果我有一些错误。
对于布局,我们有我们着名的“Lorem ipsum”文本来testing它的样子。 我正在寻找的是一组包含文本的文件,这些文件使用几种不同的编码进行编码,我可以在JUnittesting中使用这些编码来testing某些读取文本文件时处理字符编码的方法。 例: 拥有ISO 8859-1编码的testing文件和Windows-1252编码的testing文件。 Windows-1252必须触发区域80 16 – 9F 16的区别。 换句话说,它必须包含至less一个这个区域的字符,以区别于ISO 8859-1。 也许最好的一组testing文件是每个编码的testing文件包含其所有字符一次。 但也许我不知道……我们都喜欢这个编码的东西,对吧? 🙂 是否有这样一组用于字符编码问题的testing文件?
显而易见的答案是使用Charset.defaultCharset()但我们最近发现,这可能不是正确的答案。 我被告知这个结果与java.io类在几个场合中使用的真正的默认字符集不同。 看起来像Java保持2套默认字符集。 有没有人有任何关于这个问题的见解? 我们能够重现一个失败案例。 这是一种用户错误,但它可能仍然暴露其他所有问题的根本原因。 这里是代码, public class CharSetTest { public static void main(String[] args) { System.out.println("Default Charset=" + Charset.defaultCharset()); System.setProperty("file.encoding", "Latin-1"); System.out.println("file.encoding=" + System.getProperty("file.encoding")); System.out.println("Default Charset=" + Charset.defaultCharset()); System.out.println("Default Charset in Use=" + getDefaultCharSet()); } private static String getDefaultCharSet() { OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream()); String enc = writer.getEncoding(); return enc; } […]
我有一个string,我从第三方应用程序接收,我想在我的Windows Surface上使用C#在任何语言正确显示它。 由于编码不正确,我的一段string看起来像西class牙文: Acción 而应该看起来像这样: 行动组织 根据这个问题的答案: 如何知道在C#中的string编码,我收到的编码应该已经在UTF-8,但它是在Encoding.Default(可能ANSI?)上读取。 我试图将这个string转换为真正的UTF-8,但其中一个问题是我只能看到Encoding类的一个子集(仅限于UTF8和Unicode属性),可能是因为我仅限于Windows Surface API。 我已经尝试了一些我在互联网上find的片段,但是迄今为止,没有一个片段certificate对于东方语言(即韩国)是成功的。 一个例子如下: var utf8 = Encoding.UTF8; byte[] utfBytes = utf8.GetBytes(myString); myString= utf8.GetString(utfBytes, 0, utfBytes.Length); 我也尝试将string解压缩到一个字节数组,然后使用UTF8.GetString: byte[] myByteArray = new byte[myString.Length]; for (int ix = 0; ix < myString.Length; ++ix) { char ch = myString[ix]; myByteArray[ix] = (byte) ch; } myString = Encoding.UTF8.GetString(myByteArray, 0, myString.Length); […]
在工作中,似乎没有一周没有一些编码相关的内涵,灾难或灾难。 这个问题通常来自程序员,他们认为他们可以在不指定编码的情况下可靠地处理“文本”文件。 但是你不能。 所以决定今后禁止以*.txt或*.text结尾的文件。 这样的想法是,这些扩展误导了偶然的程序员对编码的沉闷自满,这导致不正确的处理。 根本就没有延伸,因为至less你知道你不知道你有什么。 但是,我们并不想走得太远。 相反,您将需要使用以编码结尾的文件名。 所以对于文本文件,例如,这些就像README.ascii , README.latin1 , README.utf8等 对于需要特定扩展名的文件,如果可以在文件本身内指定编码,例如Perl或Python,那么您应该这样做。 对于文件中没有这样的工具的文件,例如Java源文件,您将在扩展之前放置编码,例如SomeClass-utf8.java 。 对于输出,UTF-8将是强烈的首选。 但是对于input,我们需要弄清楚如何处理名为*.txt的代码库中的数千个文件。 我们想重新命名所有这些以符合我们的新标准。 但是,我们不可能把所有的东西都放在眼里。 所以我们需要一个实际工作的图书馆或者程序。 这些是在ASCII,ISO-8859-1,UTF-8,微软CP1252,或苹果MacRoman各种。 虽然我们知道我们可以判断出是ASCII是什么,而且我们知道是否有可能是UTF-8的一个很好的变化,但我们对8位编码难以理解。 因为我们运行在混合的Unix环境(Solaris,Linux,Darwin)中,而大多数桌面机都是Mac,所以我们有很多恼人的MacRoman文件。 而这些尤其是一个问题。 一段时间以来,我一直在寻找一种方法来编程确定哪一个 ASCII ISO-8859-1 CP1252 的MacRoman UTF-8 一个文件是在,我还没有find一个程序或库,可以可靠地区分这三个不同的8位编码。 我们可能有超过一千个MacRoman文件,所以无论使用什么字符集检测器,都必须能够嗅出这些文件。 我看过的没有什么可以pipe理的。 我对ICU字符集检测器库有很大的希望,但是却无法处理MacRoman。 我也研究过在Perl和Python中做同样的事情的模块,但是总是一样的:不支持检测MacRoman。 因此,我所寻找的是一个现有的图书馆或程序,可以可靠地确定这五个编码中哪一个是文件所在的位置,最好是多于这个编码。 特别是它必须区分我引用的三种3位编码, 尤其是MacRoman 。 这些文件超过99%的英文文本; 在其他语言中有一些,但不是很多。 如果是库代码,我们的语言偏好是按照Perl,C,Java或Python的顺序。 如果它只是一个程序,那么我们并不关心它是什么语言,只要它来自全部源代码,在Unix上运行,并且完全没有妨碍。 有没有其他人有这个问题的随机编码的十亿遗留文本文件? 如果是这样,你是怎么试图解决这个问题的,你是多么的成功? 这是我的问题中最重要的一个方面,但是我也很感兴趣的是,是否鼓励程序员使用这些文件的实际编码来命名(或重命名)它们的文件,这将有助于我们避免将来出现问题。 有没有人曾试图在体制上强制执行这项规定,如果是的话,是否成功?为什么? 是的,我完全明白为什么在这个问题的性质上不能保证一个明确的答案。 对于那些没有足够数据的小文件尤其如此。 幸运的是,我们的文件很less。 除了随机的README文件外,大多数的大小范围是50k到250k,而且很多都是大的。 任何超过几K的大小都保证是英文的。 问题领域是生物医学文本挖掘,所以我们有时处理广泛的和非常大的语料库,像所有PubMedCentral的开放式访问存储库。 BioThesaurus […]
我很困惑的文字编码和字符集。 出于许多原因,我必须在即将到来的工作中学习非Unicode,非UTF8的东西。 我在电子邮件标题中find了“charset”字样,如“ISO-2022-JP”,但在文本编辑器中没有这样的编码。 (我环顾了不同的文本编辑器。) 文字编码和字符集有什么区别? 如果你能给我看一些用例的例子,我将不胜感激。
在mysql中utf8mb4和utf8 charsets有什么区别? 我已经知道ASCII,UTF-8,UTF-16和UTF-32编码; 但我很想知道'utf8mb4'编码组与其他编码types在mysql服务器中定义的区别是什么。 使用utf8mb4而不是utf8有什么特别的好处?
维基百科说 Base64编码scheme通常用于需要对需要存储和传输的二进制数据进行编码以处理文本数据的介质。 这是为了确保数据在运输过程中保持完整无需修改。 但是不是数据总是以二进制forms存储/传输,因为我们的机器存储二进制文件的内存,这取决于你如何解释它? 因此,无论您将位模式010011010110000101101110编码为ASCII为Man还是在Base64中编码为TWFu ,您最终都将存储相同的位模式。 如果最终的编码是以零和1来表示的,而每一台机器和媒体都可以处理这些编码,那么数据是以ASCII还是Base64来表示,怎么样? 这是什么意思是“旨在处理文本数据的媒体”? 他们可以处理二进制=>他们可以处理任何事情。 谢谢大家,我想我现在明白了。 当我们发送数据时,我们不能确定数据将被解释为与我们预期的相同的格式。 所以我们发送双方都知道的某种格式的数据(比如Base64)。 这样,即使发送者和接收者以不同的方式解释相同的事物,但是因为他们对编码格式达成一致,数据也不会被错误地解释。 从马克·拜尔例子 如果我想发送 Hello world! 一种方法是像ASCII一样发送它 72 101 108 108 111 10 119 111 114 108 100 33 但是字节10可能不会被正确解释为另一端的换行符。 所以,我们使用ASCII的一个子集来对它进行编码 83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61 以相同数量的信息传输更多的数据为代价,即使接收者碰巧对字符集的其余部分有不同的解释,也能确保接收者能够以预定的方式解码数据。
我想在我的shell提示符(特别是'SKULL和CROSSBONES'(U + 2620))中添加Unicode骷髅和交叉骨,但我无法弄清魔术咒语,使回声吐出来,或者任何其他的, 4位Unicode字符。 两位数字很容易。 例如,echo -e“\ x55”,。 除了下面的答案,应该指出的是,显然,你的terminal需要支持Unicode的输出是你所期望的。 gnome-terminal在这方面做得很好,但是默认情况下它不一定是打开的。 转到terminal – >设置字符编码,并selectUnicode(UTF-8)。
垂直制表符的原始历史用法是什么(C语言中的\v ,ASCII 11)? 键盘上有钥匙吗? 如何有人生成它? 有没有任何语言或系统今天仍然在使用垂直制表符做一些有趣的事情?