Spring MVC 为例,从前台—>后台—>前台的编解码过程及出现乱码的案例

    把String Encode 成 bytes 后,Decode 必须使用相同的编码集,否则可能出现乱码。

    因为Java字符总是Unicode字符,所以在后文中,如果不加说明,“字符”或“char”都是指16位的Unicode字符,而“字节”或“byte”都是指8位字节。





案例一:为什么Java类中最好不要出现中文?

        若将中文用 utf-8 写入 .java 文件中,编译后为 .class 文件,若一个中文操作系统(如中文XP)的JVM读取该 .class 文件,因为没有“谁”像Freemarker那样告诉JVM用什么编码集来decode,所以JVM会使用默认的GBK,此时出现乱码。


案例二:为什么用native2ascii处理过的资源文件 xxx.properties ,在被读取时不会出现中文乱码?

(参考人气博客:http://blog.csdn.net/sfdev/article/details/3770706

      所有的英文字母都对应到一个数字编码,这就是ASCII码(American Standard Code for Information Interchange)。ASCII码是最古老的字符编码,它总共只定义了7位共128个字母、数字和符号。但它是其它所有字符编码的基础。Unicode常用UTF-8和UTF-16来表示。7位的ASCII码不用作任何变化,就已经是UTF-8了。但UTF-8需要用3个字节来表示一个汉字。

      GBK: 是双字节编码,是GB2312-80的扩充,在码位上和GB2312-80兼容。

      UTF-8和GBK都是将unicode压缩后来使用的,而native2ascii将中文都转换成了unicode。


案例三:工作中解析Excel时遇到的问题,去除中文字符串中的特殊空格。

      “施 兵”,实际情况中该string中间为一个特殊的空格。由nameStr.getBytes("utf-8")可知该空格的字节表示为{-62,-96}。


String nameStr = getCell(row.getCell(2));
byte []b = {-62,-96};
String blank = "";
try {
    blank = new String(b, "UTF-8");
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}
String userName = nameStr.replaceAll(blank, "");


若 new String() 时不指定utf-8,则JVM会使用默认编码集,如GBK来decode。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,您需要定义一个包含图片数据的实体类,并使用JPA注解将其映射到数据库中的一张表。例如,以下是一个包含图片数据的实体类的示例: ```java @Entity @Table(name = "image") public class ImageEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @Lob private byte[] data; // getters and setters } ``` 其中,`data` 属性使用了 `@Lob` 注解,表示将其映射为数据库中的大对象类型。 接下来,在Spring Boot中定义一个RESTful的API,用于接收前端上传的图片数据,并将其存储到数据库中。例如: ```java @RestController @RequestMapping("/api/images") public class ImageController { @Autowired private ImageRepository imageRepository; @PostMapping("/upload") public ResponseEntity<?> uploadImage(@RequestParam("file") MultipartFile file) { try { ImageEntity imageEntity = new ImageEntity(); imageEntity.setName(file.getOriginalFilename()); imageEntity.setData(file.getBytes()); imageRepository.save(imageEntity); return ResponseEntity.ok().build(); } catch (IOException e) { e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body("Failed to upload image"); } } @GetMapping("/{id}") public ResponseEntity<byte[]> getImage(@PathVariable("id") Long id) { Optional<ImageEntity> optional = imageRepository.findById(id); if (optional.isPresent()) { ImageEntity imageEntity = optional.get(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.IMAGE_JPEG); return new ResponseEntity<>(imageEntity.getData(), headers, HttpStatus.OK); } else { return ResponseEntity.notFound().build(); } } } ``` 其中,`uploadImage` 方法用于接收前端上传的图片数据,并将其存储到数据库中;`getImage` 方法用于根据图片的ID从数据库中读取图片数据,并返回给前端。 最后,在Vue前端中使用 `axios` 或其他HTTP库发送请求,上传图片并显示。例如: ```vue <template> <div> <input type="file" @change="uploadImage"> <img :src="imageUrl" v-if="imageUrl"> </div> </template> <script> import axios from 'axios'; export default { data() { return { imageUrl: null }; }, methods: { uploadImage(event) { const file = event.target.files[0]; const formData = new FormData(); formData.append('file', file); axios.post('/api/images/upload', formData) .then(() => this.fetchImage()) .catch(error => console.error(error)); }, fetchImage() { axios.get(`/api/images/${id}`, { responseType: 'arraybuffer' }) .then(response => { const imageUrl = URL.createObjectURL(new Blob([response.data], { type: 'image/jpeg' })); this.imageUrl = imageUrl; }) .catch(error => console.error(error)); } } }; </script> ``` 其中,`uploadImage` 方法用于上传图片数据;`fetchImage` 方法用于根据图片的ID从后端获取图片数据,并使用 `Blob` 对象将其转换为URL,以便在 `<img>` 标签中显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值