Barcode修改二維碼對中文的支持


Barcode2011版本, 在UnicodeIDE環境下原本二維碼處理中文時有問題, 只讀取了第一個字節轉換, 所以中文會出錯

修改psCodeStudio.pas文件,TpsQRCode.EncodePart函數

function TpsQRCode.EncodePart(const ToEncode:String; currMode: TpsQRMode):String;
var
  i, j, k: integer;
  s, s1: String;
  k1, k2: integer;
  c: Char;
  lBytes: TBytes; begin
  i := 1;

  s := GetModeIndicator(FMicroQR, currMode, FUsedVersion);

  if currMode = QrBytes then
  begin
    lBytes := TEncoding.UTF8.GetBytes(ToEncode);
    s := s + IntegerToBits(Length(lBytes), GetNumberOfBitsIndicatorSize(FMicroQR, currMode, FUsedVersion));
  end
  else
  begin
    lBytes := nil;
    s := s + IntegerToBits(Length(ToEncode), GetNumberOfBitsIndicatorSize(FMicroQR, currMode, FUsedVersion));
  end;

  case currMode of
    QrNumeric:
      while i <= Length(ToEncode) do
      begin
        s1 := Copy(ToEncode, i, 3);
        k := 0;
        for j := 1 to Length(s1) do
          k := 10 * k + Ord(s1[j]) - Ord0;
        case Length(s1) of
          1:
            s := s + IntegerToBits(k, 4);
          2:
            s := s + IntegerToBits(k, 7);
          3:
            s := s + IntegerToBits(k, 10);
        end;
        Inc(i, 3);
      end;
    QrAlphanumeric:
      while i <= Length(ToEncode) do
      begin
        c := ToEncode[i];
        if (FNC1 <> fnc1None) and (Char(c) = GS1_GroupSeparator) then
          c := '%';
        k1 := System.Pos(c, QR_AlphaTable) - 1;
        if k1 = -1 then
        begin
          s := '';
          Exit;
        end;

        Inc(i);
        if i <= Length(ToEncode) then
        begin
          c := ToEncode[i];
          if (FNC1 <> fnc1None) and (Char(c) = GS1_GroupSeparator) then
            c := '%';
          k2 := Pos(c, QR_AlphaTable) - 1;
          if k2 = -1 then
          begin
            s := '';
            Exit;
          end;
          s := s + IntegerToBits(45 * k1 + k2, 11);
        end
        else
          s := s + IntegerToBits(k1, 6);
        Inc(i);
      end;
 QrBytes: begin
      for i := Low(lBytes) to High(lBytes) do
        s := s + IntegerToBits(lBytes[i], 8);
    end;     QrKanji:
      ;
  end;
  result := s;
end;

 

以下為修改完的文件

https://files.cnblogs.com/files/lzl_17948876/psCodeStudio.rar

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM