本文将分享为什么即使使用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中¿的显示也不同?
- c – Windows和Linux上的不同的rand()结果
- c – 为什么Windows和Linux之间的标准库函数名称不同?
- c – 如何使用Qt在Windows和Linux上捕获Ctrl C
- Composer在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()结果
WIN:4068 213 12761 8758
LIN:479142414 465566339 961126155 1057886067
我的应用程序要求两台平台产生相同的输出.
我有什么选择?是否有更好的替代符合我的要求的rand()
谢谢
PS.我在Windows7上使用了MSVC 2008,在CentOS 5.5上使用了gcc 4.1.2
解决方法
c – 为什么Windows和Linux之间的标准库函数名称不同?
> _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”似乎没有提供功能列表.
解决方法
> 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
解决方法
我希望这可以适应你的具体情况.请注意,错误检查很小,应该可以改进.
用法(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
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
退出并重新打开命令行窗口,再次输入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('https://install.phpcomposer.com/installer', 'composer-setup.php');"
3.安装 Composer
php composer-setup.php
4.删除安装程序
php -r "unlink('composer-setup.php');"
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 'vendor/autoload.php'; # $log = new Monolog\Logger('name'); $log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING)); $log->addWarning('Foo');
以上就是Composer在Windows和Linux的安装和使用的详细内容,更多请关注php中文网其它相关文章!
我们今天的关于为什么即使使用UTF-8,在Windows和Linux中¿的显示也不同?的分享就到这里,谢谢您的阅读,如果想了解更多关于c – Windows和Linux上的不同的rand()结果、c – 为什么Windows和Linux之间的标准库函数名称不同?、c – 如何使用Qt在Windows和Linux上捕获Ctrl C、Composer在Windows和Linux的安装和使用的相关信息,可以在本站进行搜索。
本文标签: