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

714 阅读2分钟

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

半角转全角

既然是阅读页嘛,要等宽才好看嘛,那就安排!

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

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

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

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

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

ffd5e858b7956f99beeede9f649c6ca.jpg

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

问题的根源

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

image.png

欸?貌似并不是转换的问题? 不信邪的我又打开了dartpad

  String  re = '\n';
  print(re.length);
  print(re.codeUnits.first);
  re =toDBC(re);
  print(re);

结果是 image.png

终于破案了~

那就在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

下一章打算跟大家讨论一下分页计算的事情,请各位大神多多指导!感谢啦