GVKun编程网logo

为什么即使使用UTF-8,在Windows和Linux中¿的显示也不同?

19

本文将分享为什么即使使用UTF-8,在Windows和Linux中¿的显示也不同?的详细内容,此外,我们还将为大家带来关于c–Windows和Linux上的不同的rand()结果、c–为什么Windo

本文将分享为什么即使使用UTF-8,在Windows和Linux中¿的显示也不同?的详细内容,此外,我们还将为大家带来关于c – Windows和Linux上的不同的rand()结果、c – 为什么Windows和Linux之间的标准库函数名称不同?、c – 如何使用Qt在Windows和Linux上捕获Ctrl C、Composer在Windows和Linux的安装和使用的相关知识,希望对你有所帮助。

本文目录一览:

为什么即使使用UTF-8,在Windows和Linux中¿的显示也不同?

为什么即使使用UTF-8,在Windows和Linux中¿的显示也不同?

为什么以下显示在Linux和Windows中有所不同?

System.out.println(new String("¿".getBytes("UTF-8"), "UTF-8"));

在Windows中:

¿

在Linux中:

一个

答案1

小编典典

System.out.println()以系统默认编码输出文本,但是控制台根据其自身的编码(或“代码页”)设置解释该输出。在Windows机器上,这两种编码似乎匹配,但是在Linux机器上,输出显然是以UTF-8格式输出的,而控制台将其解码为ISO-8859-1之类的单字节编码。或者,如Jon所建议的那样,源文件被保存为UTF-8并javac正在以其他方式读取它,可以通过使用Unicode转义来避免此问题。

当您需要输出除ASCII文本以外的任何内容时,最好的选择是使用适当的编码将其写入文件,然后使用文本编辑器读取文件-
控制台过于受限且过于依赖系统。顺便说一下,这段代码:

new String("¿".getBytes("UTF-8"), "UTF-8")

…对输出没有影响。所做的全部工作就是将字符串的内容编码为字节数组,然后再次对其进行解码,从而再现原始字符串,这是一种昂贵的无操作操作。如果要以特定编码输出文本,则需要使用OutputStreamWriter,如下所示:

FileOutputStream fos = new FileOutputStream("out.txt");OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");

c – Windows和Linux上的不同的rand()结果

c – Windows和Linux上的不同的rand()结果

我注意到,标准的rand()函数在 Windows和 Linux上提供了不同的结果.当然我使用了相同的种子号码(1234).这里有几个第一个结果:

WIN:4068 213 12761 8758

LIN:479142414 465566339 961126155 1057886067

我的应用程序要求两台平台产生相同的输出.
我有什么选择?是否有更好的替代符合我的要求的rand()

谢谢

PS.我在Windows7上使用了MSVC 2008,在CentOS 5.5上使用了gcc 4.1.2

解决方法

Boost有一个 wide range of RNGs,可能是跨平台可重复的行为.

c – 为什么Windows和Linux之间的标准库函数名称不同?

c – 为什么Windows和Linux之间的标准库函数名称不同?

我正在将一个 Windows库移植到 Android(使用GNU标准C库选项,libstdc -v3),VC和GNU库之间似乎存在许多命名差异,例如:

> _stricmp被称为strcasecmp
> _unlink称为取消链接
> _scalb被称为scalbn
> _finite被称为isfinite
> _isnan被称为isnan
> _itoa和itoa似乎不存在于GNU C中
> atoi确实存在,但不是atoi64

VC和GNU库的文档意味着它们实现了“ISO”C,例如我可以从VC2008中获得一些警告而不使用“ISO C”名称,例如:“警告C4996:’itoa’:不推荐使用此项目的POSIX名称.而是使用符合ISO C的名称:_itoa.“类似地,GNU的手册说“GNU标准C库v3是一个实施ISO 14882标准C库的持续项目”.

那么图书馆如何最终得到这些不同的名字呢?如何判断哪些名称更“标准”?

另外,libstdc -v3的索引是否存在,即库中所有函数的简单列表?我只能找到一个manual和“source documentation”似乎没有提供功能列表.

解决方法

这与C标准库几乎没有关系.它更多地与C99和POSIX有关.

> strcasecmp是libstdc碰巧实现的POSIX函数. msvcrt通常与POSIX保持一定的距离.
> unlink类似 – 它是POSIX功能.
> scalbn是C99标准中函数的名称. MSVC不支持C99.然而,scalbn是C 11的一部分,所以我希望它最终会出现在msvcrt中.
> isfinite和isnan都是C99.
> itoa既不是C99也不是POSIX.这是一个奇怪的野兽,只是在夜晚出现.

我还要指出其他几个人已经指出的内容:在标准库中使用下划线实际上是非标准的任何函数前缀在技术上更为正确.这就是msvcrt中下划线激增的原因.

c – 如何使用Qt在Windows和Linux上捕获Ctrl C

c – 如何使用Qt在Windows和Linux上捕获Ctrl C

我有Qt控制台服务器应用程序.我希望有人按Ctrl C正确退出我的服务器(调用析构函数等).我已经读过 this,但是我希望这可以在Linux和Windows上工作.怎么做?

解决方法

我使用这个类在C控制台应用程序中捕获信号.不过Qt并不具体.它在Windows平台上使用SetConsoleCtrlHandler(),并由< signal.h>在其他平台上棘手的一点是,“信号”不是跨平台术语 – Windows和POSIX对它们有不同的定义.无论如何,这个类试图将它们映射到一个常见的词汇. Ctrl ^ C是在两个平台上映射良好的C ^ C.

我希望这可以适应你的具体情况.请注意,错误检查很小,应该可以改进.

用法(main.cpp)

#include "SignalHandler.h"class Application : public SignalHandler{public:    Application() : SignalHandler(SignalHandler::SIG_INT),myThread(NULL) {}    int Application::main(int argc,char *argv[])    {        // Main program instructions here (e.g. start a thread)        myThread = new Thread(...);        myThread->start();        myThread->join();        delete myThread;        return 0;    }    bool handleSignal(int signal)    {        std::cout << "Handling signal " << signal << std::endl;        if (_myThread && _myThread->isRunning())        {            _myThread->stop();            // The thread is going to stop soon,so don't propagate this signal further            return true;        }        // Let the signal propagate as though we had not been there        return false;    }private:    Thread* myThread;};int main(int argc,char* argv[]){    Application app;    return app.main(argc,argv);}

SignalHandler.h

class SignalHandler {public:    SignalHandler(int mask = DEFAULT_SIGNALS);    virtual ~SignalHandler();    enum SIGNALS    {        SIG_UNHANDLED   = 0,// Physical signal not supported by this class        SIG_NOOP        = 1,// The application is requested to do a no-op (only a target that platform-specific signals map to when they can't be raised anyway)        SIG_INT         = 2,// Control+C (should terminate but consider that it's a normal way to do so; can delay a bit)        SIG_TERM        = 4,// Control+Break (should terminate Now without regarding the consquences)        SIG_CLOSE       = 8,// Container window closed (should perform normal termination,like Ctrl^C) [Windows only; on Linux it maps to SIG_TERM]        SIG_RELOAD      = 16,// Reload the configuration [Linux only,physical signal is SIGHUP; on Windows it maps to SIG_NOOP]        DEFAULT_SIGNALS = SIG_INT | SIG_TERM | SIG_CLOSE,};    static const int numSignals = 6;    virtual bool handleSignal(int signal) = 0;private:    int _mask;};

SignalHandler.cpp

#include "SignalHandler.h"#include <assert.h>#ifndef _WIN32#include <signal.h>#else#include <windows.h>#endif //!_WIN32// There can be only ONE SignalHandler per processSignalHandler* g_handler(NULL);#ifdef _WIN32BOOL WINAPI WIN32_handleFunc(DWORD);int WIN32_physicalToLogical(DWORD);DWORD WIN32_logicalToPhysical(int);std::set<int> g_registry;#else //_WIN32void POSIX_handleFunc(int);int POSIX_physicalToLogical(int);int POSIX_logicalToPhysical(int);#endif //_WIN32SignalHandler::SignalHandler(int mask) : _mask(mask){    assert(g_handler == NULL);    g_handler = this;#ifdef _WIN32    SetConsoleCtrlHandler(WIN32_handleFunc,TRUE);#endif //_WIN32    for (int i=0;i<numSignals;i++)    {        int logical = 0x1 << i;        if (_mask & logical)        {#ifdef _WIN32            g_registry.insert(logical);#else            int sig = POSIX_logicalToPhysical(logical);            bool Failed = signal(sig,POSIX_handleFunc) == SIG_ERR;            assert(!Failed);            (void)Failed; // Silence the warning in non _DEBUG; Todo: something better#endif //_WIN32        }    }}SignalHandler::~SignalHandler(){#ifdef _WIN32    SetConsoleCtrlHandler(WIN32_handleFunc,FALSE);#else    for (int i=0;i<numSignals;i++)    {        int logical = 0x1 << i;        if (_mask & logical)        {            signal(POSIX_logicalToPhysical(logical),SIG_DFL);        }    }#endif //_WIN32}#ifdef _WIN32DWORD WIN32_logicalToPhysical(int signal){    switch (signal)    {    case SignalHandler::SIG_INT: return CTRL_C_EVENT;    case SignalHandler::SIG_TERM: return CTRL_BREAK_EVENT;    case SignalHandler::SIG_CLOSE: return CTRL_CLOSE_EVENT;    default:         return ~(unsigned int)0; // SIG_ERR = -1    }}#elseint POSIX_logicalToPhysical(int signal){    switch (signal)    {    case SignalHandler::SIG_INT: return SIGINT;    case SignalHandler::SIG_TERM: return SIGTERM;    // In case the client asks for a SIG_CLOSE handler,accept and    // bind it to a SIGTERM. Anyway the signal will never be raised    case SignalHandler::SIG_CLOSE: return SIGTERM;    case SignalHandler::SIG_RELOAD: return SIGHUP;    default:         return -1; // SIG_ERR = -1    }}#endif //_WIN32#ifdef _WIN32int WIN32_physicalToLogical(DWORD signal){    switch (signal)    {    case CTRL_C_EVENT: return SignalHandler::SIG_INT;    case CTRL_BREAK_EVENT: return SignalHandler::SIG_TERM;    case CTRL_CLOSE_EVENT: return SignalHandler::SIG_CLOSE;    default:        return SignalHandler::SIG_UNHANDLED;    }}#elseint POSIX_physicalToLogical(int signal){    switch (signal)    {    case SIGINT: return SignalHandler::SIG_INT;    case SIGTERM: return SignalHandler::SIG_TERM;    case SIGHUP: return SignalHandler::SIG_RELOAD;    default:        return SignalHandler::SIG_UNHANDLED;    }}#endif //_WIN32#ifdef _WIN32BOOL WINAPI WIN32_handleFunc(DWORD signal){    if (g_handler)    {        int signo = WIN32_physicalToLogical(signal);        // The std::set is thread-safe in const reading access and we never        // write to it after the program has started so we don't need to         // protect this search by a mutex        std::set<int>::const_iterator found = g_registry.find(signo);        if (signo != -1 && found != g_registry.end())        {            return g_handler->handleSignal(signo) ? TRUE : FALSE;        }        else        {            return FALSE;        }    }    else    {        return FALSE;    }}#elsevoid POSIX_handleFunc(int signal){    if (g_handler)    {        int signo = POSIX_physicalToLogical(signal);        g_handler->handleSignal(signo);    }}#endif //_WIN32

Composer在Windows和Linux的安装和使用

Composer在Windows和Linux的安装和使用

composer是php的一个依赖管理工具。你可以在项目中声明所依赖的代码库,并安装他们。下面由composer使用教程栏目为大家讲解composer在windows和linux(如centos)的安装和简单使用。

Composer在Windows和Linux的安装和使用

安装 Composer

1.首先请确认已经正确安装了PHP,windows打开命令行窗口/linux打开终端,执行 php -v 查看是否正确输出版本号。

windows

PS E:\repository\work> php -v
PHP 7.0.32 (cli) (built: Sep 12 2018 15:54:08) ( ZTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
登录后复制

centos

[root@jmsiteos7 ~]# php -v
PHP 7.2.13 (cli) (built: Dec  6 2018 23:18:37) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.13, Copyright (c) 1999-2018, by Zend Technologies
登录后复制

如果安装了php,但未设置环境变量,需要设置环境变量

windows

3912315d59f66f203827ebd38163a90.png

退出并重新打开命令行窗口,再次输入php -v查看版本号,如果依然不正常,请检查php目录是否正确

centos

vi /etc/profile
#文件地步输入如下两行
PATH=$PATH:/usr/local/php72/bin/:/usr/local/php72/sbin/
export PATH
#立即生效
source /etc/profile
登录后复制

再次输入php -v查看版本号,如果依然不正常,请检查php目录是否正确

2.下载 Composer

php -r "copy(&#39;https://install.phpcomposer.com/installer&#39;, &#39;composer-setup.php&#39;);"
登录后复制

3.安装 Composer

php composer-setup.php
登录后复制

4.删除安装程序

php -r "unlink(&#39;composer-setup.php&#39;);"
登录后复制

5.局部安装

以上步骤下载 Composer 的过程正确执行完毕后,可以将 composer.phar 文件复制到任意目录(比如项目根目录下),然后通过 php composer.phar 指令即可使用 Composer 了!

6.全局安装

centos

打开终端并执行如下命令将前面下载的 composer.phar 文件移动到 /usr/local/bin/ 目录下面:

mv composer.phar /usr/local/bin/composer
登录后复制

windows

进入 PHP 的安装目录,将 composer.phar 复制到 PHP 的安装目录下面,在 PHP 安装目录下新建一个 composer.bat 文件,并将下列代码保存到此文件中

@php "%~dp0composer.phar" %*
登录后复制

重新打开一个命令行窗口试一试执行 composer --version 看看是否正确输出版本号

windows

PS E:\repository\work> composer --version
Composer version 1.8.0 2018-12-03 10:31:16
登录后复制

centos

[root@jmsite ~]# composer --version
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Composer version 1.8.0 2018-12-03 10:31:16
登录后复制

这里只做演示,不可以以root身份执行composer,官方给出的解释是:某些Composer命令,包括exec,install和update允许第三方代码在您的系统上执行。这是来自其“插件”和“脚本”功能。插件和脚本可以完全访问运行Composer的用户帐户。因此,强烈建议 避免以超级用户/ root身份运行Composer。

7.升级 Composer

composer selfupdate
登录后复制

8.设置composer国内源

composer config -g repo.packagist composer https://packagist.phpcomposer.com
登录后复制

使用 Composer

1.基于composer.json

在项目的目录下创建一个 composer.json 文件,描述项目的依赖关系。

{
    "require": {
        "monolog/monolog": "1.2.*"
    }
}
登录后复制

表示需要下载从 1.2 开头的任何版本的monolog,使用下面的命令即可安装代码库

composer install
登录后复制

2.基于require 命令

若你感到创建composer.json文件麻烦,也可以在安装时使用require命令

composer require monolog/monolog
登录后复制

composer 会去寻找代码库信息,并自动创建composer.json文件和composer.lock文件

3.更新项目里所有的代码库,或者指定的某些代码库

# 更新所有代码库
composer update
# 更新指定的代码库
composer update monolog/monolog
# 更新指定的多个代码库
composer update monolog/monolog phpaes/phpaes
# 还可以通过通配符匹配代码库
composer update monolog/monolog phpaes/*
登录后复制

4.移除一个代码库,如果被其他代码库使用,则无法移除

composer remove monolog/monolog
登录后复制

5.在源中搜索代码库

composer search monolog
登录后复制

6.查看代码库信息

# 显示已经安装的代码库
composer show
# 通过通配符进行筛选
composer show monolog/*
# 具体某个代码库的信息
composer show monolog/monolog
登录后复制

自动加载

除了代码库的下载,Composer 还准备了一个自动加载文件,它可以加载 Composer 下载的代码库中所有的类文件。使用它,你只需要将下面这行代码添加到你项目的引导文件中

require &#39;vendor/autoload.php&#39;;
#
$log = new Monolog\Logger(&#39;name&#39;);
$log->pushHandler(new Monolog\Handler\StreamHandler(&#39;app.log&#39;, Monolog\Logger::WARNING));
$log->addWarning(&#39;Foo&#39;);
登录后复制

以上就是Composer在Windows和Linux的安装和使用的详细内容,更多请关注php中文网其它相关文章!

我们今天的关于为什么即使使用UTF-8,在Windows和Linux中¿的显示也不同?的分享就到这里,谢谢您的阅读,如果想了解更多关于c – Windows和Linux上的不同的rand()结果、c – 为什么Windows和Linux之间的标准库函数名称不同?、c – 如何使用Qt在Windows和Linux上捕获Ctrl C、Composer在Windows和Linux的安装和使用的相关信息,可以在本站进行搜索。

本文标签: