flutter小说阅读页之爬坑记录-半角转全角字符

最近在做一个小说app,然而昨天在做阅读页时遇到了一个奇葩的坑。

### 半角转全角
既然是阅读页嘛,要等宽才好看嘛,那就安排!

首先必须是全部字符转换为全角啦,于是就顺手写了下面这些代码。这不是so easy吗,哼哼~

```dart
String toDBC(String input) {
    var c = input.codeUnits;
    var s = '';
    for (var i = 0; i < c.length; i++) {
       if (c[i] == 32) {
        // 半角空格
        s = s + String.fromCharCode(12288);
      } else if (c[i] < 127) {
        // 半角字符
        s = s + String.fromCharCode(c[i] + 65248);
      } else {
        // 非半角字符
        s = s + String.fromCharCode(c[i]);
      }
    }
    return s;
  }
```


刷新模拟器 休~ 


![81d0139173d0eb02b195d9c7332e4c5.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b859617bd6cb41b2be0dd11e5a9ad420~tplv-k3u1fbpfcp-watermark.image?)

WTF!!! 什么情况啊这是,一瞬间 口吐芬芳~
换行呢? 还有这个奇怪的符号“ﻪ”是什么鬼?

于是我一顿尝试
str.replaceAll('\n','\r'),
str.replaceAll('\\n','\n') ,
str.replaceAll('\n','\r\n') ,

还是各种奇怪的问题,\r的话虽然能换行下去 但是行首没有空格,显然是不行的。
那么两个\r 行不行?也是不行

![ffd5e858b7956f99beeede9f649c6ca.jpg](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/926ac3110ca64397b83904393f27a0f1~tplv-k3u1fbpfcp-watermark.image?)

于是我就气呼呼的滚去睡觉了。

### 问题的根源
早上醒来神清气爽,吃完早餐打开电脑,一道亮光突然射进了脑海。
我tm是不是把换行符给转换成了全角?
于是我用在线转换工具试了一下

![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f35265048e6a4f58b18c5b2714f8785e~tplv-k3u1fbpfcp-watermark.image?)

欸?貌似并不是转换的问题?
不信邪的我又打开了[dartpad](https://dartpad.dev/?)

```
  String  re = '\n';
  print(re.length);
  print(re.codeUnits.first);
  re =toDBC(re);
  print(re);
  ```
结果是
![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/42bae2df2a9e4dd39272b56bfe538fdc~tplv-k3u1fbpfcp-watermark.image?)

终于破案了~

那就在for循环里排除掉就好了嘛
```
   String toDBC(String input) {
    var c = input.codeUnits;
    var s = '';
       for (var i = 0; i < c.length; i++) {
      if (c[i] == 32) {
        // 半角空格
        s = s + String.fromCharCode(12288);
      } else if (c[i] < 127) {
        // 半角英文字符
        //如果前后为换行符,则不转换
        if (c[i] == 10) {
          s = s + String.fromCharCode(c[i]);
        } else {
          s = s + String.fromCharCode(c[i] + 65248);
        }
      } else {
        // 非半角字符
        s = s + String.fromCharCode(c[i]);
      }
    }
    return s;
  }
```
再运行一下看看,大功告成!

![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a54c8e4aafe14fd08bd2570e8e0967f7~tplv-k3u1fbpfcp-watermark.image?)

你可能感兴趣的:(flutter,flutter,小说,flutter转全角,半角转全角,flutter等宽字符)