繁体   English   中英

在PHP中将字符串转换为utf-8

[英]Convert string into utf-8 in php

有一个用Java编写的脚本,我正在尝试将其转换为PHP,但是没有得到相同的输出。

如何在PHP中获得与Java中相同的效果?

用Java编写的脚本

String key = "hghBGJH/gjhgRGB+rfr4654FeVw12y86GHJGHbnhgnh+J+15F56H";

byte[] kSecret = ("AWS4" + key).getBytes("UTF8");

输出: [B@167cf4d

用PHP编写的脚本

$secret_key = "hghBGJH/gjhgRGB+rfr4654FeVw12y86GHJGHbnhgnh+J+15F56H";
utf8_encode("AWS4".$secret_key);

输出: AWS4hghBGJH/gjhgRGB+rfr4654FeVw12y86GHJGHbnhgnh+J+15F56H

您得到的结果[B@167cf4d是对字节数组的toString()调用。 [B表示该值是一个字节数组。 @167cf4d是它在虚拟内存中的位置。 您根本无法获得PHP脚本来提供相同的结果。 您需要做的是在Java端修复打印,但是我们不知道您使用什么API以及在哪里打印。 它是Web应用程序,本地应用程序等吗?

编辑:
由于您在Java Web应用程序中使用它,因此有两种可能的情况。 该代码位于Servlet或JSP中。 如果它在servlet中,则必须将输出设置为UTF-8,然后可以像这样简单地打印字符串:

        response.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();
        out.write("AWS4");
        out.write(key);

如果是在JSP中,这会带来一些不便,因为在打印开始之前,必须确保不要像换行那样保留空白。 对于常规的HTML页面来说,这不是问题,但是如果您需要精确格式化输出到最后一个字节,这是一个问题。 responseout对象很容易在那里存在。 您可能会有一些带有属性的<%@page标签,因此您必须确保在关闭最后一个标签时打开下一个标签。 另外,文件末尾的新行可能会使结果倾斜,因此通常不建议将JSP用于对空格敏感的数据输出。

您不能在不将字节数组转换为字符串的情况下对字节数组进行sysout操作,默认情况下,执行以下操作时会默认调用UTF-8 toString():

System.out.println("Weird output: " + byteArray);

这将输出您上面提到的垃圾。 而是,创建标准String类的新实例。

System.out.println("UTF-8: " + new String(byteArray));

在Java中,您获得字节数组的对象引用,而不是其值。 尝试:

new String(kSecret, "UTF-8");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM