我创建了一个java程序(REST)服务。整个开发/测试是在Windows上完成的,现在生产测试的部署正在进行中。但是,发生了“小”编码问题:
String s3 = new String("grün".getBytes(), "UTF-8");
logger.info(s3);
logger.info("das ist wirklich grün");
logger.info(new String("das ist wirklich grün".getBytes("UTF-8"), "UTF-8"));
我通过HTTP属性接收(Web应用程序托管在tomcat上,后面是一个带有auth插件的apache)我需要处理的一些值。它们的编码方式与您在第1行中看到的相同。(此值显示在Windows和Linux上)。
当我将其转换为第1行中的UTF-8并将其写入日志文件(log4j)时,我的Windows机器上有“grün”(这是正确的)一词。在linux服务器上,我仍然有相同的输出。
然后我尝试直接使用Umlaute(üäöetc),就像第2行一样,并且在Windows和Linux上都将值正确地写入日志文件中。然后,我尝试像第3行那样进行转换,但结果相同:两个操作系统都显示相同的结果。
这两台机器在Java中具有相同的Locale(Locale.getDefault()) - >我已经试过了。我无法改变将值插入HTTP-Request的方式!
答案 0 :(得分:1)
这样的事情无效:
String s3 = new String("grün".getBytes(), "UTF-8");
这里会发生什么:使用您运行此系统的系统的默认字符编码获取字符串"grün"
的字节数(因为您没有在调用{{{ 1}})然后将这些字节转换回getBytes()
,指定这些字节是UTF-8编码的文本:
characters =>默认字符编码中的字节(可能是也可能不是UTF-8)=>转换回字符,好像字节是UTF-8编码文本
如果系统的默认字符编码是UTF-8,那么显然只能正常工作。在Windows上它不是(它可能是Windows-1252)。
字符串本身没有character encoding。没有" UTF-8字符串"或者"将字符串从X转换为UTF-8"。字符编码指定字符串中的字符如何转换为字节,反之亦然,但不是字符串本身的属性。 可以具有一个字节数组,表示以特定字符编码编码的文本。 (就像"十进制"和"十六进制"不是数字本身的属性,只是你如何呈现数字)。
不要以这样的方式编写程序,使其依赖于运行的系统的默认字符编码;这意味着,不要在String
上调用getBytes()
而不指定字符编码(例如,如果您没有指定,则还有其他API调用使用默认编码)。
答案 1 :(得分:1)
这两台机器在Java中具有相同的区域设置(
Environment: Request Method: GET Request URL: http://127.0.0.1:8000/ Django Version: 1.9.7 Python Version: 3.5.2 Installed Applications: [...I omitted] Installed Middleware: [...I omitted] Traceback: File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response 149. response = self.process_exception_by_middleware(e, request) File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response 147. response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/home/keepair/djangogirls/blog/views.py" in post_list 33. return JsonResponse(serializers.serialize('json', post_list), safe=False) File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/django/core/serializers/__init__.py" in serialize 129. s.serialize(queryset, **options) File "/home/keepair/djangogirls/myvenv/lib/python3.5/site-packages/django/core/serializers/base.py" in serialize 83. concrete_model = obj._meta.concrete_model Exception Type: AttributeError at / Exception Value: 'str' object has no attribute '_meta'
) - >我已经试过了。
它是默认的字符集,而不是默认的语言环境,用于确定在解码/编码没有指定字符集的字符串时使用的字符集。
检查Windows和Linux计算机上的Locale.getDefault()
返回内容。根据您报告的症状,我希望它们会有所不同。
答案 2 :(得分:0)
请在两种环境下比较JVM版本。这是最可能与编码有关的问题。