常见编程语言对字符编码一览表

2022-09-28 16:26:55 浏览数 (1)

[TOC]

0x00 编程语言编码函数
JavaScript

描述:主要对于 escape , encodeURI 与 encodeURIComponent 区别详解: 它们都是用来对URI (RFC-2396)字符串进行编码的全局函数,但是它们的处理方式和使用场景有所不同:

代码语言:javascript复制
1.保留字符(reserved characters):这类字符是URI中的保留关键字符,它们用于分割URI中的各个部分。这些字符是:";" | "/" | "?" | ":" | "@" | "&" | "=" | " " | "$" | ","

2.Mark字符(mark characters):这类字符在RFC-2396中特别定义,但是没有特别说明用途,可能是和别的RFC标准相关。 这些字符是:"-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"

3.基本字符(alphanum characters):这类字符是URI中的主体部分,它包括所有的大写字母、小写字母和数字。

escape不编码字符有69个:                *, ,-,.,/,@,_,0-9,a-z,A-Z
encodeURI不编码字符有82个:             !,#,$,&,',(,),*, ,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURIComponent不编码字符有71个:    !,',(,),*,-,.,_,~,0-9,a-z,A-Z

实际案例:

代码语言:javascript复制
//#Js编码函数
escape(url)
"https://www.jb51.net/article/109025.htm?name=test&web=osrf"
​
encodeURI(url)
"https://www.jb51.net/article/109025.htm?name=test&web=osrf"
​
encodeURIComponent(url)
"https://www.jb51.net/article/109025.htm?name=test&web=osrf"

基础示例2:

代码语言:javascript复制
//我们看到 encodeURI 没有编码uri的保留字符 & ,'中'被编码成了 ��,encodeURIComponent 就编码了保留字符& 
alert(encodeURIComponent("A&T Plastic")); //A&T Plastic
alert(escape("A&T Plastic"));  //A&T Plastic
alert(encodeURI("A&T Plastic"));  //A&T Plastic
alert(escape("A&T Plastic中"));  //A&T Plastic��

总结:编码方式的应用场景

  • 如果只是处理 get 提交时url地址中的乱码问题,可以使用 encodeURI 来编码整个url;
  • 如果参数中含有保留字符需要进行编码,应该使用 encodeURIComponent 来编码部分参数;
  • 如果使用encodeURIComponent来处理中文乱码,那么前端需要使用两次encodeURIComponent(encodeURIComponent('你好')),Java后端使用:java.Net.URLDecoder.decode(param,"UTF-8");

0x01 编码与解码
base64/32

采用Linux中Shell进行base64/32编码和解码

代码语言:javascript复制
# base 加解密(默认base64) 
echo test|base64 
echo dGVzdAo=|base64 -d

#32与64位base编码与解码是不同的:
$ echo 123456 | base32.exe
GEZDGNBVGYFA====
$ echo 123456 | base64.exe
MTIzNDU2Cg==

#批量加密解密:
#!/bin/bash
#Base64 Encrpty/Decrpty
exec 3<>num.txt
while read line<&3;do
    echo $line | base64
done
for i in $(cat 1.txt);do
    echo $i | base64 -d 1>>te.txt 2>/dev/null
    echo -e "" >> te.txt
done

WeiyiGeek.

采用Openssl命令

代码语言:javascript复制
#生成的随机数转换成为base64/32
openssl rand -base64 8 #长度8的倍数
 b7WUZwW7R4=

WeiyiGeek.

Hex/Dec/Bin

Shell实现

代码语言:javascript复制
#八进制转换为Ascll
for i in 60 61 62 63 64 65 66 67 70 71
do
    printf "Octal=$i,Ascll=\$i n"
done

#十六进制转Ascll
for i in 60 61 62 63 64 65 66 67 70 71
> do         
>      printf "hex=$i,Ascll=x$i n"
> done

WeiyiGeek.

bc命令实现 描述:bc是Linux 在命令行下有个强大的计算器工具

代码语言:javascript复制
[root@WeiGeek ~]# yum -y install bc   <!--安装命令-->
代码语言:javascript复制
echo "obase=输出进制数;ibase=输入进制数;输入的数字" | bc
echo "obase=16;ibase=10;30" | bc   #将10进制的30转换成16进制-

基础示例:

代码语言:javascript复制
#!/bin/bash
if [ $# = 0 ];then
  echo "usage:${0} outputbase inputbase jzvalue"
else
  oubase=$1
  inbase=$2
  value=$3
  echo "obase=${oubase};ibase=${inbase};${value}" | bc
fi
usage:obase.sh outputbase inputbase jzvalue
#sh obase.sh 16 10 225
  1. C语言itoa函数的进制转换:(注意不一定通用,在stdlib.h头文件中)

同时可以换算其他进制比如7进制 32 进制,更改后面的进制数的十进制即可语法:

代码语言:javascript复制
//itoa(input变量名, ouput变量名, 进制数);
char dest[10];
itoa(src, dest, 2);
printf("二进制 --> %sn", dest);

代码案例:

代码语言:javascript复制
#include <stdio.h>
#include <stdlib.h>
int main ()
{
    int i;
    char buffer[33];
    printf("Enter a number: ");
    scanf("%d", &i);

    itoa(i, buffer, 10);
    printf("decimal: %sn", buffer);

    itoa(i, buffer, 2);
    printf("binary: %sn", buffer);

    itoa(i, buffer, 8);
    printf("octal: %sn", buffer);

    itoa(i, buffer, 16);
    printf("hexadecimal: %sn", buffer);
    return 0;
}

printf函数进行标准进制转换

代码语言:javascript复制
#include <stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    printf("转换的进制为:n");
    printf("octal:%o",n);
    printf("decimal:%u",n);
    printf("hexadecimal:%x",n);
    return 0;
}

编写一个程序,用递归实现将一个十进制的正整数转换成二进制的形式显示

代码语言:javascript复制
#include <stdio.h>
void binary(unsigned long n);
void binary(unsigned long n)
{
  int r;
  r = n % 2;  //取余
  if (n >= 2){
          binary(n / 2); //进行递归
  }
  putchar('0'   r); // '0'=>48   1 == '1' (归-精华之所在)
}

int main(void){
  unsigned long number;
  printf("请输入一个正整数:");
  scanf("%lu", &number);
  binary(number);
  putchar('n');
  return 0;
}

0 人点赞