unicode标准中有足够的代码点,你需要4个字节来存储它们.这就是UTF-32编码所做的.然而,UTF-8编码通过使用称为"可变宽度编码"的东西以某种方式将这些压缩到更小的空间.
实际上,它设法在一个字节中代表US-ASCII的前127个字符,它看起来与真正的ASCII完全相同,因此您可以将许多ascii文本解释为UTF-8而不对其执行任何操作.干净的把戏.那么它是怎样工作的?
我将在这里提出并回答我自己的问题,因为我只是做了一些阅读以弄清楚它并且我认为它可能会节省其他人一些时间.如果我有一些错误,也许有人可以纠正我.
有没有办法改变文件的编码?例如UTF-8到ISO 8859-1?
设置示例Sublime文本: __CODE__
我有以下字符串值:"walmart obama"
我正在使用MySQL和Java.
我收到以下异常:`java.sql.SQLException:字符串值不正确:'\ xF0\x9F\x91\xBD\xF0\x9F ...'
这是我要插入的变量:
var1 varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL`
Run Code Online (Sandbox Code Playgroud)
我试图插入"walmart obama"的Java代码是一个preparedStatement.所以我正在使用这种setString()方法.
看起来问题是值的编码.我怎样才能解决这个问题?以前我使用的是Derby SQL,而且最终只有两个sqaures(我认为这是null字符的表示)
非常感谢所有帮助!
在工作中似乎没有一周没有一些编码相关的conniption,灾难或灾难.这个问题通常来自程序员,他们认为他们可以在不指定编码的情况下可靠地处理"文本"文件.但你不能.
因此,已经决定从此以后禁止文件的名称以*.txt或结尾*.text.我们的想法是,这些扩展误导了偶然程序员对编码的沉闷,这会导致处理不当.没有任何扩展几乎会更好,因为至少你知道你不知道你有什么.
但是,我们并不是那么远.相反,您将需要使用以编码结尾的文件名.因此,对于文本文件,例如,这些会是这样README.ascii,README.latin1,README.utf8,等.
对于需要特定扩展的文件,如果可以在文件本身内部指定编码,例如在Perl或Python中,那么您应该这样做.对于像Java源这样的文件,文件内部不存在这样的工具,你将把编码放在扩展名之前,例如SomeClass-utf8.java.
对于输出,UTF-8是非常优选的.
但是对于输入,我们需要弄清楚如何处理我们的代码库中的数千个文件*.txt.我们想重命名所有这些以符合我们的新标准.但我们不可能全都注意它们.所以我们需要一个真正有效的库或程序.
它们有各种ASCII,ISO-8859-1,UTF-8,Microsoft CP1252或Apple MacRoman.虽然我们知道我们可以判断某些东西是否为ASCII,并且我们知道某些东西是否可能是UTF-8,但我们对8位编码感到困惑.因为我们在混合的Unix环境(Solaris,Linux,Darwin)中运行,大多数桌面都是Mac,所以我们有很多烦人的MacRoman文件.这些尤其是一个问题.
一段时间以来,我一直在寻找一种方法来以编程方式确定哪一个
文件在,我还没有找到一个程序或库,可以可靠地区分这三种不同的8位编码.我们可能单独拥有超过一千个MacRoman文件,因此我们使用的任何字符集检测器都必须能够嗅出它们.我看过的任何东西都无法解决问题.我对ICU字符集检测器库寄予厚望,但它无法处理MacRoman.我也看过模块在Perl和Python中做同样的事情,但一次又一次它总是相同的故事:不支持检测MacRoman.
我正在寻找的是一个现有的库或程序,它可靠地确定文件所在的五种编码中的哪一种 - 并且最好不止于此.特别是它必须区分我引用的三个3位编码,尤其是MacRoman.这些文件的英文文本超过99%; 其他语言中有一些,但并不多.
如果它是库代码,我们的语言首选项是它在Perl,C,Java或Python中,并按此顺序.如果它只是一个程序,那么我们并不关心它是什么语言,只要它是完整的源代码,在Unix上运行,并且完全不受阻碍.
有没有其他人有这个随机编码的遗留文本文件的问题?如果是这样,你是如何尝试解决它的,你有多成功?这是我的问题中最重要的方面,但我也对你是否认为鼓励程序员用这些文件所在的实际编码来命名(或重命名)他们的文件感兴趣,这将有助于我们避免将来出现这个问题.曾经尝试过任何人强制执行该体制的基础上,如果是的话,是说成功与否,为什么?
是的,我完全明白为什么鉴于问题的性质,人们无法保证给出明确的答案.对于小文件尤其如此,您没有足够的数据可供使用.幸运的是,我们的文件很少.除随机README文件外,大多数的大小范围为50k到250k,而且许多都更大.任何超过几K的东西都保证是英文的.
问题领域是生物医学文本挖掘,因此我们有时处理广泛且极大的语料库,就像所有PubMedCentral的Open Access资源库一样.一个相当庞大的文件是BioThesaurus 6.0,为5.7千兆字节.这个文件特别烦人,因为它几乎都是UTF-8.但是,我相信,有些numbskull会在其中插入几行8位编码 - 微软CP1252.在你旅行之前需要一段时间.:(
我是XML的新手,我正在努力理解基础知识.我在"学习XML"中读到了以下这一行,但对我来说仍然不太清楚.有人能指出我的书或网站,清楚地解释这些基础知识吗?
从学习XML:
XML声明描述了文档的一些最常见的属性,告诉XML处理器它需要一个XML解析器来解释这个文档.
这是什么意思?
我理解这个xml version部分 - doc的doc和user都应该在同一版本的XML中"讨论".但那encoding部分呢?为什么这有必要?
我正在尝试使用Python(只有法语和/或西班牙语字符)读取带有重音字符的CSV文件.基于csvreader的Python 2.5文档(http://docs.python.org/library/csv.html),我提出了以下代码来读取CSV文件,因为csvreader仅支持ASCII.
def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
# csv.py doesn't do Unicode; encode temporarily as UTF-8:
csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),
dialect=dialect, **kwargs)
for row in csv_reader:
# decode UTF-8 back to Unicode, cell by cell:
yield [unicode(cell, 'utf-8') for cell in row]
def utf_8_encoder(unicode_csv_data):
for line in unicode_csv_data:
yield line.encode('utf-8')
filename = 'output.csv'
reader = unicode_csv_reader(open(filename))
try:
products = []
for field1, field2, field3 in reader:
...
Run Code Online (Sandbox Code Playgroud)
以下是我试图阅读的CSV文件的摘录:
0665000FS10120684,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) …Run Code Online (Sandbox Code Playgroud) 在我的ASP.NET应用程序中,我试图通过键入空格键在两个文本框之间添加几个空格.等效的HTML源 代替 .所以我只是想检查一下:这是白色空间的新替代品吗?如果是的话,任何想法为什么会改变?
我的老师告诉我ASCII是8位字符编码方案.但它仅定义为0-127个代码,这意味着它可以适合7位.那么不能说ASCII位实际上是7位代码吗?
当说ASCII完全是8位代码时,我们要说什么呢?
显而易见的答案是使用,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;
}
}
Run Code Online (Sandbox Code Playgroud)
我们的服务器需要Latin-1中的默认字符集来处理传统协议中的一些混合编码(ANSI/Latin-1/UTF-8).所以我们所有的服务器都运行这个JVM参数,
-Dfile.encoding=ISO-8859-1
Run Code Online (Sandbox Code Playgroud)
这是Java 5的结果,
Default Charset=ISO-8859-1
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=ISO8859_1
Run Code Online (Sandbox Code Playgroud)
有人试图通过在代码中设置file.encoding来更改编码运行时.我们都知道这不起作用.但是,这显然抛弃了defaultCharset(),但它不会影响OutputStreamWriter使用的实际默认字符集.
这是一个错误或功能吗?
编辑:接受的答案显示了问题的根本原因.基本上,您不能信任Java 5中的defaultCharset(),它不是I/O类使用的默认编码.看起来Java 6纠正了这个问题.
我正在Google App Engine中编写一个Web应用程序.它允许人们基本上编辑作为.html文件存储在blobstore中的html代码.
我正在使用fetchData来返回byte[]文件中的所有字符.我正在尝试打印到html,以便用户编辑html代码.一切都很棒!
这是我现在唯一的问题:
转换回字符串时,字节数组有一些问题.聪明的报价和几个角色看起来很时髦.(?或日语符号等)具体来说,我看到的几个字节都有负值导致问题.
智能引号赶回来,-108和-109字节数组英寸 为什么这样,我如何解码负字节以显示正确的字符编码?