Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >校园导航问题(河大版)

校园导航问题(河大版)

作者头像
喜欢ctrl的cxk
发布于 2019-11-08 09:54:31
发布于 2019-11-08 09:54:31
1.1K00
代码可运行
举报
文章被收录于专栏:Don的成长史Don的成长史
运行总次数:0
代码可运行

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_42449444/article/details/85266144

【问题描述】

以我校为例,设计一个校园导航系统,主要为来访的客人提供信息查询。系统有两类登陆账号,一类是游客,使用该系统方便校内路线查询;一类是管理员,可以使用该系统查询校内路线,可对校园景点路线可编辑。

【需求分析】

设计学校的平面图,至少包括10个以上景点(场所),每两个景点间可以有不同道路,且路长也可能不同,找出在游人所在景点到其他景点的最短路径,或游人输入的任意两个景点的最短路径。

要求:

(1) 以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,路径权重为路径长度。

(2) 为游人提供任意景点相关信息查询。

(3)为游人提供任意景点的问路查询,即任意两个景点之间的最短路径。

实现提示:

一般情况下,校园道路是双向通行的,可设计校园平面图是一个无向图。顶点和边均含有相关信息。

选做内容:

(1)提供图的编辑功能:增删景点;增删道路;修改已有信息等。

(2)校园导游图的仿真界面。

【概要设计】

1. 抽象数据类型定义:

(1)景点

顶点名称 代号 顶点信息简介

Typedef struct{

Int num;

Char name[100];

Char features[200];

} VertexType;

(2)图的存储结构:

Typedef int EdgeType;

Typedef struct{

VertexType vexs[MaxVertexNum];

EdgeType edges[MaxVertexNum][MaxVertexNum];

Int n, e;

} MGraph;

2. 主要功能模块

(1)创建图的邻接矩阵存储结构 void create( Graph *G );

(2) 浏览图中任一景点介绍 VertexType GetVex(Graph *G, int v);

(3) 修改景点信息 void PutVertex(Grahp *G, int v);

(4) 增加景点信息 void InsertVertex(Graph*G, VertexType v);

(5) 删除景点信息 void DeleteVertex(Graph *G, VertexType v);

(6) 增加道路 void InsertArc(Graph *G,int v, int w);

(7) 删除道路 void DeleteArc(Graph*G ,int v,int w);

(8) 查找某一景点到其他景点的最短路径 void ShortestPath(Graph *G, int P[ ], int D[ ]);

(9) 查找任一两个景点之间的最短路径。Void ToDestination(Graph *G, int v, int w);

3. 主模块流程

管理员登陆,可实现(1)-(9)功能操作

游客登陆,在(1)基础实现基础之上,可实现 (2)(8)(9)功能操作

一些瞎扯淡的话:

额,数据结构老师给定的抽象数据类型定义和主要功能模块让我感jio有点难受啊。我用C++写的,然后所有的自定义函数都没按照老师的来,名字不一样参数也不一样,不过并不影响功能实现,最后是800多行 27311个字节。上周给老师检查的时候,老师运行程序之后先看到了1314ms的羊驼界面(我忍笑...这个羊驼界面真实地表达了我对这个大作业的真情实感,羊驼只对大作业哦,老师还是挺好的!)。

老师说“这个还挺有趣的哈,不过神兽也救不了你。”然后老师问我“账号密码是啥?”我:“打开那个记事本,里面存了管理员的账号密码,只有我们俩个晓得哦,不要把密码告诉别人哦(一脸Just kidding的表情)。”老师:“诶?为啥我复制粘贴不对?”旁边同学说:“老师您少复制了个小数点。”我正插着腰站在旁边看呢(别问我为啥叉腰!)

老师进入功能菜单界面之后,我说:“老师您别一顿乱敲暴力输入呀,不然又会出现刚刚那个羊驼界面,然后退出程序。只要不暴力输入怎么操作都行!”老师对着键盘疯狂哒哒哒地敲,说:“行,找到一个bug,请我一顿饭啊(老师当然是开玩笑的啦~)”。我:“要得!”(我当时就是这样插着腰站在老师旁边。)

接着老师疯狂吐槽我的查询功能太垃圾了(just kidding),因为我的程序是在用户输入地点名的基础上来实现的,“校门南口”必须完整输入“校门南口”这四个字才能查询到,输入“校门”二字没用,我没有用KMP算法来对字符串子串进行模式匹配,更别说“校门口”这种模糊查询啦。只见老师疯狂敲击键盘进行操作,大概5 6分钟之后,那个价值一顿饭的bug被老师发现了(lol?)!我的天,震惊!老师真的太秀了!下文会还原一波老师找出那个价值连饭的bug时的操作(那个bug已经被我修复了)。

部分代码:

预处理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <bits/stdc++.h>
#include <conio.h>
#include <windows.h>
using namespace std;
#define MAX 51
#define INF 9999

顶点结构体如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//顶点结构体
typedef struct
{
    int num;      //地点序号
    string name;  //地点名称
    string info;  //简单得不能再简单的地点简介
}VertexNode;

邻接矩阵结构体,存路径。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//邻接矩阵结构体,存路径
typedef struct
{
    int Edge[MAX][MAX];  //边集
    int vn;    //顶点数目
    int en;    //边数目
    VertexNode Vex[MAX] = //顶点集
    {
        {1,"体检中心","河北大学体检中心"},{2,"邯郸音乐厅","河北大学邯郸音乐厅"},
        {3,"网计学院","河北大学网络空间安全与计算机学院"},{4,"信息学部","河北大学信息学部"},
        {5,"操场","河北大学体育场"},{6,"图书馆","河北大学图书馆"},
        {7,"花园景观","花园景观"},{8,"校门南口","正对着图书馆的那个校门"},
        {9,"校门北口","挨着北街的那个校门"},{10,"校门东口","挨着食堂的那个校门"},
        {11,"餐厅","河北大学的食堂,有三层"},{12,"银杏景观","里面很多银杏树,秋天的时候挺好看的"}
    };
}AdjMatrix;

全局变量的设置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//全局变量
bool isAdmin;   //判断用户身份是不是管理员
bool isFirst = true;   //只在第一次创建邻接矩阵的时候为true
int weight[MAX][MAX];
AdjMatrix S;    //一定要全局变量,不然添加和删除操作会无法实现
AdjMatrix *G;  //用一个AdjMatrix 指针指向创建好的邻接矩阵S的地址

写在主函数前的函数声明,只有Create()是引用传参,其他的函数都是指针作形参。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//登录时的主菜单界面
void Login_Menu();
//管理员登录时用的函数
void Admin_Login();
//不可描述的自定义函数
void Alpaca();
//管理员的主菜单界面
void Admin_Menu();
//游客的主菜单界面
void Tour_Menu();
//根据当前状态来返回菜单的函数
void Back_Menu();
//根据地点名称确认地点序号
int Locate(AdjMatrix *G,string name);
//采用邻接矩阵创建无向网
void Create(AdjMatrix &G);
//添加校园地点
void Insert_Vex(AdjMatrix *G);
//添加校园路径
void Insert_Edge(AdjMatrix *G);
//查询所有地点信息
void Inquiry_All_Vex(AdjMatrix *G);
//查询某一地点信息
void Get_Vex(AdjMatrix *G);
//查询某一地点到其他所有地点的最短路径
void Inquiry_Short_Edge(AdjMatrix *G);
//查询任意俩点间的最短路径
void Inquiry_A2B_Short_Edge(AdjMatrix *G);
//删除校园地点
void Delete_Vex(AdjMatrix *G);
//删除校园路径
void Delete_Edge(AdjMatrix *G);
//修改校园地点信息
void Modify(AdjMatrix *G);

简洁的主函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
{
    Login_Menu();
    return 0;
}

不可描述的羊驼函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//不可描述的函数
void Alpaca()
{
    string str0 = "┌─┐";
    string str1 = "┌──┘";
    string str2 = "┴───────┘";
    string str3 = "┴──┐";
    string str4 = "│";
    string str5 = "──";
    string str6 = "─┬┘";
    string str7 = "└┬─";
    string str8 = "─┴─";
    string str9 = "└───┐";
    string str10 = "┌───┘";
    string str11 = "└──────────────┐";
    string str12 = "├─┐";
    string str13 = "┌─┘  ";
    string str14 = "└─┐";
    string str15 = "┐";
    string str16 = "┌───────┬──┐";
    string str17 = "┌──┘";
    string str18 = "┤";
    string str19 = "└──┴──┘";
    cout << setw(31) << str0 << setw(13) << str0 << endl;
    cout <<setw(30)<< str1 <<setw(19)<<str2<<setw(9)<<str3<< endl;
    cout << setw(24) << str4 <<setw(19)<<str4<< endl;
    cout << setw(24) << str4 << setw(11) <<str5<<setw(10)<< str4 << endl;
    cout << setw(24) << str4 << setw(19) << str4 << endl;
    cout << setw(24) << str4 << setw(9)  << str6 << setw(11) << str7 << setw(5) << str4 << endl;
    cout << setw(24) << str4 << setw(19) << str4 << endl;
    cout << setw(24) << str4 << setw(19) << str4 << endl;
    cout << setw(24) << str4 << setw(13) << str8 <<setw(9)<<str4<< endl;
    cout << setw(24) << str4 << setw(19) << str4 << endl;
    cout << setw(32) << str9 << setw(19)<< str10 << endl;
    cout << setw(28) << str4 << setw(11) << str4 << endl;
    cout << setw(28) << str4 << setw(11) << str4 << endl;
    cout << setw(28) << str4 << setw(11) << str4 << endl;
    cout << setw(28) << str4 << setw(11) << str4 << endl;
    cout << setw(28) << str4 << setw(41) << str11 << endl;
    cout << setw(28) << str4 << setw(26) << str4 << endl;
    cout << setw(28) << str4 << setw(30) << str12 << endl;
    cout << setw(28) << str4 << setw(32) << str13 << endl;
    cout << setw(28) << str4 << setw(26) << str4 << endl;
    cout << setw(32) << str14 <<setw(4)<<str15<<setw(26)<<str16<<setw(10)<<str17<< endl;
    cout << setw(30) << str4 <<setw(4)<<str18<<setw(4)<<str18<<setw(9)<<str4<<setw(4)<<str18
         <<setw(4)<<str18<< endl;
    cout << setw(42) << str19 <<setw(21)<<str19<< endl;
    cout << "  " << endl;
    cout << setw(43) << "神兽保佑"<<endl;
    cout << " " << endl;
    cout << setw(43) << "永无bug!" << endl;
    Sleep(1314);   //等待1314ms
    system("cls"); //清屏
}

登录时的主菜单界面,不管用户选择哪种登录方式,都应该先调用Create函数创建邻接矩阵。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//登录时的主菜单界面
void Login_Menu()
{
    cout << setw(52) << "正在进入河北大学导航系统......" << endl;
    Alpaca();   //登录前的开场动画
    cout << "\n\t\t        欢迎进入河北大学校园导航系统\n\n";
    cout << "\t\t『1』   --------------------------   以管理员身份登录\n\n";
    cout << "\t\t『2』   --------------------------   以游客身份进入\n\n";
    cout << "\t\t『0』   --------------------------   退出\n\n";
    cout << "\t\t请输入您选择的序号:";
    int n;
    while(cin >> n && n != 0)
    {
        //创建邻接矩阵
        if(isFirst)
        {
            Create(S);   //Create函数的形参是一个引用
            G = &S;
            isFirst = false;
        }
        switch(n)
        {
            case 1: Admin_Login(); isAdmin = true;  break;   //管理员
            case 2: Tour_Menu(); isAdmin = false; break;   //游客
            default: cout << "请输入0~2以内的数字:"; break;  //输入0直接退出,我个人觉得没必要再写case0了
        }
    }
    cout << "正在退出河北大学校园导航系统......" << endl;
    Alpaca();
    exit(0);
}

管理员登录时用到的函数,账号和密码是用一个map来存放的,如果需要添加管理员信息操作起来也方便。密码是用getch来输入的,输入密码的同时打印*号。需要注意的是验证密码是否输入正确时,是将map中的value值——一个string型的字符串与用户输入的char*型字符串进行比较,此时应该先用c_str()函数来把string型强制转换成char*型,再用strcmp进行比较。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//管理员登录时用到的函数
void Admin_Login()
{
    map<string,string> m;   //map的key值是管理员的账号、value值是管理员的密码
    //添加管理员的账号密码信息
    m["Student"] = "TYD123456.";
    m["Teacher"] = "SQX654321.";
    int count = 3;   //账号和密码输入错误的次数不能超过3次
    while(count--)
    {
        string id;
        cout << "请输入您的账号:" << endl;
        cin >> id;
        int i = 0;
        char pw[50],ch;
        cout << "请输入您的密码:" << endl;
        while((ch = getch()) != '\r')    // \r是回车符,回到行首
        {
            if(ch == '\b')   // \b是退格符
            {
                if(i > 0)
                {
                    printf("\b \b");
                    --i;
                }
            }
            else
            {
                pw[i++] = ch;
                printf("*");
            }
        }
        pw[i] = '\0';
        cout << endl;
        bool flag = false;   //判断密码是否为真
        for(auto it : m)    //for-each循环遍历map
        {
            //string型可以直接==比较,string型和char*型比较需要将string用c_str()转换后再用strcmp比较
            if((it.first == id) && strcmp(it.second.c_str(), pw) == 0)
            {
                flag = true;
            }
        }
        if(flag)
        {
            isAdmin = true;   //是管理员
            cout << id << ",恭喜您登录成功。" << endl;
            Admin_Menu();
        }
        else
        {
            isAdmin = false;   //不是管理员
            if(count == 0)
            {
                break;
            }
            cout << "您输入的账号或密码错误,请您重新输入。" << endl;
        }
    }
    cout << "连续三次输入错误,您将以游客身份进入校园导航系统,";
    system("pause");
    Tour_Menu();
}

管理员的功能菜单界面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//管理员的功能菜单界面
void Admin_Menu()
{
    cout << "\n\t\t        欢迎进入河北大学校园导航系统\n\n";
    cout << "\t\t                   您的身份是管理员\n\n";
    cout << "\t\t『1』   --------------------------   添加校园地点\n\n";
    cout << "\t\t『2』   --------------------------   添加校园路径\n\n";
    cout << "\t\t『3』   --------------------------   查询校园所有地点信息\n\n";
    cout << "\t\t『4』   --------------------------   查询校园任一地点信息\n\n";
    cout << "\t\t『5』   --------------------------   查询某一地点到其他地点的最短路径\n\n";
    cout << "\t\t『6』   --------------------------   查询俩点间的最短路径\n\n";
    cout << "\t\t『7』   --------------------------   删除校园地点\n\n";
    cout << "\t\t『8』   --------------------------   删除校园路径\n\n";
    cout << "\t\t『9』   --------------------------   修改校园地点信息\n\n";
    cout << "\t\t『0』   --------------------------   退出\n\n";
    cout << "请输入您选择的序号:";
    int n;
    while(cin >> n && n != 0)
    {
        switch(n)
        {
            case 1: Insert_Vex(G);   break;   //添加校园地点
            case 2: Insert_Edge(G);  break;   //添加校园路径
            case 3: Inquiry_All_Vex(G); break; //查询校园所有地点信息
            case 4: Get_Vex(G); break; //查询校园任一地点信息
            case 5: Inquiry_Short_Edge(G); break; //查询某一地点到其他地点的最短路径
            case 6: Inquiry_A2B_Short_Edge(G); break; //查询俩点间的最短路径
            case 7: Delete_Vex(G); break; //删除校园地点
            case 8: Delete_Edge(G); break; //删除校园路径
            case 9: Modify(G); break; //修改校园地点信息
            default: cout << "请输入0~9以内的数字:"; break;  //输入0直接退出,我个人觉得没必要再写case0了
        }
    }
    cout << "正在退出河北大学校园导航系统......" << endl;
    Alpaca();
}

游客的功能菜单界面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//游客的功能菜单界面
void Tour_Menu()
{
    cout << "\n\t\t        欢迎进入河北大学校园导航系统\n\n";
    cout << "\t\t              您的身份是游客\n\n";
    cout << "\t\t『1』   --------------------------   查询校园所有地点信息\n\n";
    cout << "\t\t『2』   --------------------------   查询校园任一地点信息\n\n";
    cout << "\t\t『3』   --------------------------   查询某一地点到其他地点的最短路径\n\n";
    cout << "\t\t『4』   --------------------------   查询俩点间的最短路径\n\n";
    cout << "\t\t『0』   --------------------------   退出\n\n";
    cout << "请输入您选择的序号:";
    int n;
    while(cin >> n && n != 0)
    {
        switch(n)
        {
            case 1: Inquiry_All_Vex(G); break; //查询校园所有地点信息
            case 2: Get_Vex(G); break; //查询校园任一地点信息
            case 3: Inquiry_Short_Edge(G); break; //查询某一地点到其他地点的最短路径
            case 4: Inquiry_A2B_Short_Edge(G); break; //查询俩点间的最短路径
            default: cout << "请输入0~4以内的数字:"; break;  //输入0直接退出,我个人觉得没必要再写case0了
        }
    }
    cout << "正在退出河北大学校园导航系统......" << endl;
    Alpaca();
}

返回菜单函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//根据当前登录状态来返回菜单的函数
void Back_Menu()
{
    if(isAdmin)
    {
        Admin_Menu();
    }
    else
    {
        Tour_Menu();
    }
}

采用邻接矩阵来创建无向网时(我是从0开始的而不是1),建立边的关系时需要注意一点:校园路径都是双向的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//采用邻接矩阵创建无向网
void Create(AdjMatrix &G)
{
    G.vn = 12;   //顶点数
    G.en = 20;   //边数
    int i,j,k;
    //初始化边的信息
    for (int i = 0; i < MAX; i++)
    {
        for (int j = 0; j < MAX; j++)
        {
            G.Edge[i][j] = INF;
        }
    }
    weight[0][1] = 200;    //体检中心和邯郸音乐厅间的距离为200
    weight[0][4] = 350;    //体检中心和操场间的距离为350
    weight[1][2] = 500;    //邯郸音乐厅和网计学院间的距离为500
    weight[1][3] = 500;    //邯郸音乐厅和信息学部间的距离为500
    weight[1][4] = 480;    //邯郸音乐厅和操场间的距离为480
    weight[1][5] = 400;    //邯郸音乐厅和图书馆间的距离为400
    weight[2][7] = 400;    //网计学院和校门南口间的距离为400
    weight[3][6] = 100;    //信息学部和花园景观间的距离为100
    weight[3][7] = 400;    //信息学部和校门南口间的距离为400
    weight[4][5] = 280;    //操场和图书馆间的距离为280
    weight[4][8] = 200;    //操场和校园北口间的距离为200
    weight[5][6] = 100;    //图书馆和花园景观间的距离为100
    weight[5][9] = 300;    //图书馆和校门东口间的距离为300
    weight[6][7] = 500;    //花园景观和校门南口间的距离为500
    weight[6][9] = 200;    //花园景观和校门东口间的距离为200
    weight[7][9] = 600;    //校门南口和校门空口间的距离为600
    weight[8][10] = 100;   //校门北口和餐厅间的距离为100
    weight[8][11] = 100;   //校门北口和银杏景观间的距离为100
    weight[9][10] = 100;   //校门东口和餐厅间的距离为100
    weight[10][11] = 100;  //餐厅和银杏景观间的距离为100
    //建立边的关系
    int temp;
    for (i = 0; i < G.vn; i++)
    {
        for (j = 0; j < G.vn; j++)
        {
            if(weight[i][j]!=0 || weight[j][i]!=0)
            {
                if(weight[i][j] != 0)
                {
                    temp = weight[i][j];
                }
                else
                {
                    temp = weight[j][i];
                }
                G.Edge[i][j] = temp;
                G.Edge[j][i] = temp;
            }
        }
    }
//查看这个无向图
/*  for(i=0;i<G.vn;i++)
    {
		for(j=0;j<G.vn;j++)
        {
            printf("%d ",G.Edge[i][j]);
        }
		cout << endl;
	}
*/
}

根据地点名称确认地点编号的Locate函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//根据地点名称确认地点编号 
int Locate(AdjMatrix *G,string name)
{
    for (int i = 0; i < G->vn; i++)
    {
        //若图中含有该地点,则返回其编号
        if(G->Vex[i].name == name)
        {
            return i+1;
        }
    }
    return -1;   //若图中不存在该地地点,则返回-1
}

利用Dijkstra算法查询某一地点到其他所有地点的的最短路径。知道写这个之后,任俩点的最短路径也就简单了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//查询某一地点到其他所有地点的的最短路径――――Dijkstra算法  已经ok
void Inquiry_Short_Edge(AdjMatrix *G)
{
    int start = -2;
    string name;
    while(start == -2)
    {
        cout << "请输入查询地点名称:";
        cin >> name;
        start = Locate(G,name)-1;
    }
    int i,j,k;
    int D[MAX][MAX];    //D[]表示最短距离
    int P[MAX][MAX];    //P[]记录路径
    //初始化
    for(i = 0; i < G->vn; i++)
    {
        for(j = 0; j < G->vn;j++)
        {
            D[i][j] = G->Edge[i][j];
            P[i][j] = j;
        }
    }
    //Dijkstra算法
    for(int k = 0; k < G->vn; k++)
    {
        for(int i = 0; i < G->vn; i++)
        {
            for(int j = 0; j < G->vn; j++)
            {
                if(D[i][j] > D[i][k] + D[k][j])
                {
                    D[i][j] = D[i][k] + D[k][j];
                    P[i][j] = P[i][k];
                }
            }

        }
    }
    //输出
    for(j = 0; j < G->vn; j++)
    {
        if(j != start && G->Vex[j].num != -1)
        {
            printf("从%s到%s的距离是:%d,",G->Vex[start].name.c_str(),G->Vex[j].name.c_str(),D[start][j]);
            k = P[start][j];
            cout << "路径为:" << G->Vex[start].name;
            while(k != j)
            {
                cout << "->" << G->Vex[k].name;
                k = P[k][j];
            }
            cout << "->" << G->Vex[j].name << endl;
        }
    }
    cout << "即将返回菜单,";
    system("pause");
    Back_Menu();
}

嘤....嘤嘤....剩下的功能实现起来都挺简单的啦,需要注意的是删除地点的时候记得删除相关路径。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/12/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入刨析字符乱码
一.背景 在日常Ulink活动跟进过程中,有时活动页面打开的时候会遇到乱码的情况(如下图所示),于是就想乱码到底是怎么产生的,遇到乱码的情况应该怎么去解决,带着这些问题,我去查阅了相关的资料,在这里整理成文章分享给大家,希望对大家有所帮助。 二.乱码产生的原因 我们都知道,计算机是只认识0和1的二进制数的,所以不管是字母,汉字,或者符号,都是以某种编码方式转换成二进制数据存放在计算机中,需要显示的时候,就用相同的编码方式把二进制数据解码出来就可以了。那么这就很好理解乱码的产生了,如果我们用A编码方式将
腾讯VTeam技术团队
2020/11/10
8780
数据读写API——IO流
IO指的是Input和Output,主要目的是实现数据在存储介质之间的传输。【流:数据流,类比与水流的流动】
Noneplus
2019/09/24
6460
数据读写API——IO流
常见乱码问题分析
在字符集这一篇文章中,我们基本了解了字符集的一些概念,也知道了什么是编码,什么是编码什么是解码。那么接下来我们就聊聊乱码。
@阿诚
2020/09/01
1.5K0
常见乱码问题分析
关于编码的那些事
之前做一个POC的时候,Vicky同学遇到一个关于编码的问题,问到我,我觉得当时没有解释得很清楚,于是决定查阅相关的资料文档,写一篇文章,记录这个问题及对背后的原因、原理的理解。
Bruce Li
2019/07/30
7760
关于编码的那些事
Python2中的中文字符编解码浅析
自动化测试过程中,输入文本、读取文件、解析网络请求、字符串断言、正则匹配这些步骤都是必不可少的。而Python是测试过程中最为常用的语言之一,很多测试团队的自动化代码和用例都是使用Python语言开发和维护的。 由于Python在最初发布时,Unicode标准还没有完成,所以一直以来Python对Unicode的支持并不完全,而ASCII编码支持的字符有限。因此在涉及到中文的自动化用例中,经常会遇到中文字符编解码的各种各样的异常。本文从文字编码的历史讲起,抛砖引玉,浅析了Python2.x版本中文字处理的原
腾讯移动品质中心TMQ
2018/02/08
1.6K0
Python2中的中文字符编解码浅析
字符集和字符编码
我们都知道在计算机内部,所有的数据在存储和运算的时候都应该使用二进制进行表示。例如字母,数字等等。通过二进制进行表示,我们可以指定很多规则来表示这些字符,为了避免不一致性,美国国家标准学会(American National Standard Institute , ANSI )制定了 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)编码。
用户7657330
2020/08/14
1.2K0
建议收藏,彻底搞懂字符编码问题,从此告别中文乱码
字符编码是计算机技术的基石,本文希望帮助大家彻底梳理清楚字符编码问题,不仅知其然,还知其所以然,摆脱被中文乱码支配的感觉。
业余草
2019/12/20
1.6K0
建议收藏,彻底搞懂字符编码问题,从此告别中文乱码
老是遇到乱码问题:它是如何产生的,又如何解决呢?
中文乱码问题在我们日常开发中司空见惯,那么乱码问题是如何产生的呢?又怎样去解决乱码问题呢?本文将结合基本概念和例子展开阐述,希望大家有收获。
捡田螺的小男孩
2020/04/15
1.1K0
老是遇到乱码问题:它是如何产生的,又如何解决呢?
《Java从入门到失业》第三章:基础语法及基本程序结构(3.6):基本数据类型及字符集编码(字符编码和char型)
       咦?怎么好像有东西乱入了?不是讲基本数据类型么?哈哈,因为还剩下最后一个char型了,因为char型会牵涉到Unicode编码相关,因此我决定先科普一下字符集编码。
用户7801119
2020/09/27
7790
java中byte, iso-8859-1, UTF-8,乱码的根源
Post@https://ryan-miao.github.io 测试代码https://github.com/Ryan-Miao/someTest/commit/50241e50d4b6ecdb8820e58f4cb9628bfb7d77ec 背景 还是多语言, 在项目中遇到本地环境和服务端环境不一致乱码的情形。因此需要搞清楚乱码产生的过程,来分析原因。 获取多语言代码如下: private Map<String, String> getLocalizationContent(Locale locale
Ryan-Miao
2018/03/13
3.2K0
java中byte, iso-8859-1, UTF-8,乱码的根源
一篇文章帮你解决中文乱码问题---JavaWeb中文编码问题全面解析
这就是为什么我们在浏览器的地址栏中能看到中文,但是把地址拷贝出来后中文就变成了一些奇怪的串了。
谭庆波
2018/08/10
4.8K0
一篇文章帮你解决中文乱码问题---JavaWeb中文编码问题全面解析
计算机基础篇 | 一看就懂的字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码问题
做通信的时候,或者使用IO流读写数据的时候脑袋总是晕晕乎乎的。 与计算机打交道久了,不可避免会看到“鬼画符”式的乱码,让人云里雾里的,特别烦人。
烟雨平生
2023/10/20
6K0
计算机基础篇 | 一看就懂的字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码问题
一文打通计算机字符编码
字符编码:字符集只是规定了有哪些字符,而最终决定采用哪些字符,每一个字符用多少字节 表示等问题,则是由编码来决定的。计算机要准确的处理各种字符集文字,需要进行字符编码, 以便计算机能 够识别和存储各种文字
一个风轻云淡
2023/09/24
2910
《面试季》高频面试题-编码,乱码知识
  在编码的江湖中,"乱码"算得上我们遇到的最难缠的"敌人"之一,一旦遇上、轻则心情烦躁、重则心态崩溃。文章开头,让我们再次重温与"乱码"初见面的名场面。
IT学习日记
2022/09/13
6160
《面试季》高频面试题-编码,乱码知识
各种编码格式,你懂得!!!
GBK,ISO-8859-1,GB2312的本质区别 编码有几种 ,计算机最初是在美国等国家发明的 所以表示字符只有简单的几个字母只要对字母进行编码就好 我们标准码 iso-8859-1 这就是一个标准 但是后来计算机普及了 于是就中国要使用计算机了 但是机器不认得中文,于是就有了国际码。 gbk gb2312都是这类。两个其实一个,一个是标准(发布的代号),一个是简称。后来多了个阿拉伯语、日语、韩语......所以就出来统一编码UniCode ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。此字符集主要支持欧洲使用的语言。
李才哥
2019/07/10
11.2K0
各种编码格式,你懂得!!!
计算机是如何存储数据的?
理清ASCII、Unicode、GBK、UTF-8编码之间的关系 - 织梦笔记 (dedenotes.com)
小小范
2021/12/07
2.5K0
计算机是如何存储数据的?
Java---IO加强(3)-IO流的操作规律
源:InputStream Reader 一定是被读取的。 目的:OutputStream Writer 一定是被写入的。
谙忆
2021/01/21
3420
Java Web中的中文编码问题分析
在计算机中存储信息的最小单位是1个字节,即8bit,所以能标识的最大字符范围是0~255,而人类自然语言中例如汉语、日语要表示的符号太多,无法单纯用一个字节来完全表示,为了解决这个矛盾必须要有一个新的人类可识别的数据存储结构字符,而从char到byte必须编码。
张哥编程
2024/12/19
1840
Java Web中的中文编码问题分析
JDK1.9-转换流
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/12/10
5860
JDK1.9-转换流
再再谈java乱码:GBK和UTF-8互转尾部乱码问题分析(续)
在《再谈java乱码:GBK和UTF-8互转尾部乱码问题分析》我们分析了,如果从一个UTF-8 的字节序列,经过 new String(b,"GBK") 的操作,"可能"(与总字节数有关)会破坏数据。结果可能是,损失最后一个"字"。
pollyduan
2019/11/04
2.4K0
推荐阅读
相关推荐
深入刨析字符乱码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验