1、字符集不匹配
如果在处理中文字符时出现乱码或无法正确显示的情况,很可能是由于字符集不匹配导致的。Java中常用的字符集是UTF-8和GBK,确保输入、输出和存储的字符集一致。
2、文件编码问题
在读取或写入文件时,需要指定正确的字符集。可以使用InputStreamReader和OutputStreamWriter来指定字符集,例如:UTF-8类型的读取
读取的时候由于编码不统一造成乱码。
只需要同步编码类型即可。
import java.io.*; public class Test { public static void main(String[] args) { FileInputStream fis = null; try { fis = new FileInputStream("D:\\save\\study\\javaStu\\APIDemos\\src\\main\\java\\file.txt"); InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); BufferedReader br = new BufferedReader(isr); String line = null; while((line = br.readLine())!=null){ System.out.println(line); } br.close(); } catch (FileNotFoundException | UnsupportedEncodingException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } }
这里用的是绝对路径,如果相对路径建议使用反射的方式读取文件。
import org.springframework.util.ResourceUtils; String path = new File(ResourceUtils.getURL("classpath:").getPath().toString()).getAbsolutePath();
有了这个路径再去寻找指定文件就靠谱了。
3、字符串编码转换
如果需要对字符串进行编码转换,可以使用String的getBytes和构造函数来指定字符集
import java.io.UnsupportedEncodingException; public class Test { public static void main(String[] args) { String str = "中文"; byte[] utf8Bytes = new byte[0]; try { utf8Bytes = str.getBytes("UTF-8"); String gbkStr = new String(utf8Bytes, "GBK"); System.out.println(gbkStr); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } }
正确操作
4、URL编码问题
在处理URL时,需要对其中的中文字符进行编码。可以使用java.net.URLEncoder来进行URL编码。
import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; public class Test { public static void main(String[] args) { try { String url = "http://example.com?userName=中文"; String encodedUrl = URLEncoder.encode(url, "UTF-8"); String decodeUrl = URLDecoder.decode(encodedUrl, "UTF-8"); System.out.println(encodedUrl); System.out.println(decodeUrl); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } }
有两个包操作
import java.net.URLDecoder; import java.net.URLEncoder;
5、数据库编码问题
在与数据库交互时,需要确保数据库连接和表的字符集设置正确。可以在连接字符串中指定字符集。
String url = "jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=UTF-8";
示例:
jdbc:mysql://rm-bp1zq3879r28p726lco.mysql.rds.aliyuncs.com:3306/test?characterEncoding=utf8
6、HttpServletRequest中文过滤
在JavaWeb中,可以使用过滤器(Filter)来对请求中的中文进行过滤处理。过滤器是在Servlet容器中用来拦截请求和响应的组件,可以对请求进行修改、增强或者验证等操作。
要实现对请求中的中文进行过滤,可以按照以下步骤进行操作:
创建一个过滤器类,实现javax.servlet.Filter
接口,并重写doFilter
方法。
import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; public class ChineseFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作,如果有需要可以在这里进行 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String method = httpRequest.getMethod(); // 只对POST请求进行处理,可以根据需要修改 if ("POST".equals(method)) { request.setCharacterEncoding("UTF-8"); } // 继续执行过滤链 chain.doFilter(request, response); } @Override public void destroy() { // 销毁操作,如果有需要可以在这里进行 } }
在web.xml配置文件中配置过滤器和过滤器映射。
<filter> <filter-name>ChineseFilter</filter-name> <filter-class>com.example.ChineseFilter</filter-class> </filter> <filter-mapping> <filter-name>ChineseFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
上述代码中,com.example.ChineseFilter
需要替换为你实际的过滤器类的完整路径。
这样配置后,过滤器会拦截所有的请求,并对POST请求中的中文参数进行UTF-8编码处理,确保正确处理中文字符。