Move

  • Go to : Ctrl + T
  • Go to line : Ctrl + G
  • Peek/Go to Definision : Alt + F12
  • Go To Definision : F12
  • Go To Declaration : Ctrl + F12
  • Find : Ctrl + F
  • Find in Files : Ctrl + Shift + F

Navigating

  • Quick Launch : Ctrl + Q
  • Scroll Bar Map Mode : Ctrl + Q, searching 'map'
  • Class View : Ctrl + Shift + C
  • Open Document : Ctrl + Shift + G
  • Toggle Header/Code File : Ctrl + K, Ctrl + O

Refactoring Code

  • Function Rename : Ctrl + R, Ctrl + R
  • Code up and down : Alt + Up/Down
  • Save : Ctrl + S
  • Save All : Ctrl + Shift + S
  • IntelliSense refresh suggestion : Ctrl + J

Debugging

  • Start : F5
  • Step Over : F10
  • Step Into : F11
  • Step Out : Shift + F11
  • Stop : Shift + F5

Visual Studio with CMake

https://devblogs.microsoft.com/cppblog/cmake-support-in-visual-studio/

 

C++ Refactoring

https://devblogs.microsoft.com/cppblog/all-about-c-refactoring-in-visual-studio-2015-preview/

 

참고

https://devblogs.microsoft.com/cppblog/c-debugging-and-diagnostics/

https://devblogs.microsoft.com/cppblog/c-code-editing-and-navigation-in-visual-studio/

https://devblogs.microsoft.com/cppblog/getting-started-with-visual-studio-for-c-and-cpp-development/

'개발 > C,C++' 카테고리의 다른 글

.dll과 .lib의 차이  (0) 2023.02.23
[C++] invalid new-expression of abstract class type 에러  (0) 2022.04.10

.dll과 .lib의 차이

dll은 동적 공유 라이브러리이고, lib는 dll에 저장된 함수와 데이터에 대한 정보를 담고 있는 파일이다.

(빌드할때 필요함)

.dll (Dynamic Link Library) 

윈도우 운영체제에서 동작하는 동적 공유 라이브러리.

재사용 가능한 코드, 데이터, 리소스를 담고 있는 컴파일된 파일로, 실행 시점에 로딩되고, 여러 프로세스에서 공유하여 사용할 수 있다.

1. 함수를 실행파일에 포함시켜 배포하는 것이 아니라, 별도의 dll 파일로 배포

2. 어플리케이션이 실행 중에 dll에 포함된 함수가 필요하면, dll을 로드하고 해당 함수를 호출함

 

라이브러리란

미리 만들어놓은 함수, 클래스, 자료형, 데이터 등을 모아놓은 것으로, 여러 프로그램에서 재사용될 수 있다.

라이브러리가 생긴 이유

  • 코드의 재사용 및 부품화 실현 : 자주 사용하는 함수들은, 한번 만들어 놓고 다시 사용(라이브러리가 소프트웨어 개발의 부품 같은 역할을 함)
  • 기술 유출 방지 : 소스를 제공하지 않음으로서 중요 기술 유출 방지
  • 개발 시간 단축 : 새로 개발하지 않고 라이브러리의 함수들을 가져다 씀으로서 개발 기간 단축 가능, 새로 개발하는 코드 양이 적어지므로 디버깅도 용이해짐

라이브러리의 종류

  • 정적 라이브러리 (Static library) : 빌드 타임에 정적 링킹을 위해 필요한 라이브러리. 프로그램 빌드 시, 링커가 필요한 함수를 정적 라이브러리에서 찾은 후 복사하여 실행파일에 포함시킨다.
  • 동적 라이브러리 (Dynamic library) : 런타임에 로딩되는 라이브러리. 프로그램 실행 중(런타임)에 해당 함수가 필요할 때 로딩되는 라이브러리이다. 윈도우에서는 주로 DLL 확장자를 가지며, 리눅스에서는 주로 SO 확장자를 가진다.
  • 공유 라이브러리(Shared library) : 여러 어플리케이션이나 프로세스에서 공유되어 사용될 목적으로 만들어진 라이브러리. 예를 들어, 3개의 프로그램에서 A라는 공유 라이브러리를 사용한다고 하면, A는 메모리에 한번만 로드되고 각 프로그램은 로드된 A를 같이 사용한다.

즉, DLL이란 동적 라이브러리공유 라이브러리의 특징을 지닌 라이브러리이다.

 

DLL 구조

실행파일 포맷과 유사하다. 주요 구성요소는 아래와 같다.

  • Export table : 다른 프로그램에서 접근 가능한 함수와 데이터의 리스트를 담고 있는 테이블. DLL의 public interface이다.
  • Import table : DLL이 다른 라이브러리에서 사용하는 함수와 데이터의 리스트를 담고 있는 테이블. DLL의 private interface이다.
  • Code & Data 섹션 : DLL 안에 있는 함수의 구현체와, 그 함수에서 사용되는 데이터이다.
  • 리소스 : DLL에는 여러 프로그램에서 공유할 수 있는 아이콘, 비트맵, 문자열 테이블과 같은 리소스도 포함될 수 있다.

프로그램이 DLL을 로드할 때 먼저 import 테이블을 읽어 DLL이 다른 라이브러리에서 필요로 하는 기능과 데이터를 결정한다. 그런 다음 필요한 라이브러리를 로드한다. import 테이블에서 필요로하는 모든 라이브러리가 로딩되고 나면, 프로그램은 export 테이블을 통해 DLL의 기능과 데이터에 액세스할 수 있다.

전반적으로 DLL의 구조는 여러 프로그램이 동일한 코드와 리소스를 공유할 수 있도록 설계되어 성능이 향상되고 메모리 사용량이 감소할 수 있다.

 

컴파일러가 DLL에 영향을 미치는가?

컴파일러 선택은 특히 DLL이 C++ API를 노출하는 경우 DLL에 영향을 미칠 수 있다. 컴파일러마다 C++ 기호에 대한 이름 맹글링 규칙이 약간 다를 수 있기 때문에 DLL과 이를 사용하는 응용 프로그램 간에 호환성 문제가 발생할 수 있다.

예를 들어 DLL이 특정 버전의 MSVC 컴파일러로 컴파일된 경우 해당 DLL을 사용하는 응용 프로그램도 동일한 버전의 MSVC 컴파일러로 컴파일해야 호환성 문제를 방지할 수 있다.

그러나 DLL이 일반적으로 동적 연결에 사용되는 C API를 노출하는 경우 컴파일러 선택이 덜 중요하다. C API에는 일반적으로 DLL을 빌드하는 데 사용되는 컴파일러와 독립적인 고정 호출 규칙이 있기 때문이다.

 

Name mangling(이름 맹글링)이란?

소스 코드에 선언된 함수 또는 변수의 이름을 컴파일 단계에서 컴파일러가 일정한 규칙을 가지고 변형하는 것

 

Name mangling을 사용하는 이유

  • 객체 지향 언어에서 오버로딩(Overloading) 하는 동일한 이름의 함수를 구별하여 호출하기 위함
  • 다른 Namespace에 있는 동일한 이름의 함수와 변수를 에러 없이 구별하여 호출하기 위함

 

.lib (Library)

DLL에 저장된 함수와 데이터에 대한 정보를 담고 있는 파일.

빌드 타임에 링커가 어플리케이션을 링킹하는데 lib 안의 정보들을 사용한다.

 

 

참고

https://sens.tistory.com/33

https://atmkofw.tistory.com/26

https://en.wikipedia.org/wiki/Library_(computing) 

https://namu.wiki/w/DLL

https://en.wikipedia.org/wiki/Dynamic-link_library

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=v_lovepooh_v&logNo=220377595136

Chat GPT 답변

What's the difference of .dll and .lib?

.dll and .lib are file extensions commonly used in Windows-based systems.

A .dll (Dynamic Link Library) file is a type of library file that contains code and data that can be used by multiple applications at the same time. DLLs are used to implement reusable functionality and reduce the size of executable files by sharing common code. When an application requires a function that is implemented in a DLL, the application loads the DLL and calls the function.

A .lib (Library) file is a file that contains information about functions and data stored in a DLL. The information stored in a .lib file is used by the linker to link the application with the DLL at build time. The .lib file contains information about the functions and data exported by the DLL, as well as information about any dependencies the DLL may have.

In summary, .dll files contain the actual implementation of reusable functionality, while .lib files provide information about the functions and data exported by the .dll file, allowing applications to link to the .dll at build time.

 

What's the difference of shared library and dynamic library?

The terms "shared library" and "dynamic library" are sometimes used interchangeably, but they do have different meanings.
A shared library is a library that is designed to be shared by multiple applications or processes. It is a compiled file that contains code and data that can be loaded and executed by more than one program at the same time. This is achieved through a mechanism called "linking," which is the process of combining one or more object files and libraries into a single executable file. When a program is linked to a shared library, it only includes a reference to the library, not the actual code. This makes the program smaller in size and allows multiple programs to share the same code, which can result in improved performance and reduced memory usage.

A dynamic library is a type of shared library that is loaded into memory at runtime, rather than at compile time. This means that the library code is not included in the executable file, but is loaded from a separate file when the program is run. This allows the program to load and unload the library as needed, which can reduce memory usage and improve performance. Dynamic libraries can also be updated or replaced without the need to recompile the entire program, which can simplify the software development process.

In summary, shared libraries are libraries that can be shared by multiple applications, while dynamic libraries are a type of shared library that is loaded into memory at runtime, rather than at compile time. Dynamic libraries can offer some advantages over shared libraries, such as improved performance and flexibility.

 

What are the compiler effects on dlls?

The choice of compiler can have an effect on the DLL, especially if the DLL exposes a C++ API. This is because different compilers can have slightly different name mangling conventions for C++ symbols, which can lead to compatibility issues between the DLL and the application using it.

For example, if a DLL is compiled with a particular version of the MSVC compiler, an application that uses that DLL must also be compiled with the same version of the MSVC compiler in order to avoid compatibility issues.

However, if a DLL exposes a C API, which is typically used for dynamic linking, the choice of compiler is less important. This is because C APIs typically have a fixed calling convention that is independent of the compiler used to build the DLL.

'개발 > C,C++' 카테고리의 다른 글

[Visual Studio] 단축키  (0) 2023.02.28
[C++] invalid new-expression of abstract class type 에러  (0) 2022.04.10

OPcache란

미리 컴파일된 바이트코드를 공유 메모리에 저장함으로써, 매 요청마다 PHP가 스크립트를 로딩하고 파싱하는 부분을 제거하여 PHP의 성능을 향상시키는 모듈이다.

OPcache improves PHP performance by storing precompiled script bytecode in shared memory, thereby removing the need for PHP to load and parse scripts on each request.

 

OPcache 설치하기

yum install php-opcache

 

OPcache 설정하기

/etc/php.d/10-opcache.ini 설정파일 내용을 아래와 같이 변경해준다.

(각 성능에 관련된 값은 디폴트를 쓰려면 주석 해제하지 않으면 되고, 아니면 서버에 맞게 조정하면 된다.)

- opcache.enable = 1 // 0 이면 비활성화

- opcache.validate_timestamps = 1 // 0이면 변경사항을 반영할 때 수동으로 opcache를 reset 하거나 웹서버를 재부팅 해야 한다.

; Enable Zend OPcache extension module
zend_extension=opcache

; Determines if Zend OPCache is enabled
opcache.enable=1

; Determines if Zend OPCache is enabled for the CLI version of PHP
;opcache.enable_cli=0

; The OPcache shared memory storage size.
opcache.memory_consumption=512

; The amount of memory for interned strings in Mbytes.
opcache.interned_strings_buffer=32

; The maximum number of keys (scripts) in the OPcache hash table.
; Only numbers between 200 and 1000000 are allowed.
opcache.max_accelerated_files=1000000

; The maximum percentage of "wasted" memory until a restart is scheduled.
;opcache.max_wasted_percentage=5

; When this directive is enabled, the OPcache appends the current working
; directory to the script key, thus eliminating possible collisions between
; files with the same name (basename). Disabling the directive improves
; performance, but may break existing applications.
;opcache.use_cwd=1

; When disabled, you must reset the OPcache manually or restart the
; webserver for changes to the filesystem to take effect.
opcache.validate_timestamps=1

; How often (in seconds) to check file timestamps for changes to the shared
; memory storage allocation. ("1" means validate once per second, but only
; once per request. "0" means always validate)
opcache.revalidate_freq=1

 

php-fpm 재시작하기

php-fpm을 사용중이라면, 재시작한다. (사용 안하면 패스)

systemctl restart php-fpm

 

웹서버 재시작하기

systemctl restart httpd

 

동작 확인

phpinfo를 통해, opcache가 제대로 동작하고 있는지 확인한다.

PHP-FPM (FastCGI Process Manager) 이란?

PHP 스크립트를 실행하는 데 사용되는 PHP용 대체 FastCGI 구현입니다. 이를 통해 PHP 프로세스를 보다 잘 관리할 수 있으며 높은 트래픽 부하를 보다 효율적으로 처리할 수 있도록 하여 PHP 애플리케이션의 성능을 향상시킬 수 있습니다. PHP-FPM은 일반적으로 Nginx 및 Apache와 같은 웹 서버와 함께 사용되어 동적 웹 페이지를 제공하고 보다 빠르고 안정적이며 효율적인 PHP 환경을 제공합니다.

 

웹서버는 정적인 HTML 웹문서 파일만을 처리하며, 동적인 페이지 구현을 위해서는 외부 프로그램을 이용해야 합니다.

이를 위해 CGI 방식을 사용할 수 있는데, 이는 요청할 때마다 새로운 프로세스를 생성하여 구동하기에 부하가 많아지면 처리 속도가 느려질 수 있습니다.

이를 해결하기 위해 나온 것이 FastCGI 방식으로, 이미 생성한 프로세스를 재활용하여 처리속도가 빠릅니다.

PHP FastCGI Process Manager인 php-fpm은 이 FastCGI 방식을 구현한 것으로, CGI와 비교해 보다 빠른 성능을 보여줍니다.

 

PHP-FPM 적용방법

Apache에서 PHP-FPM을 사용하려면 PHP와 PHP-FPM을 모두 설치한 다음 Apache가 PHP-FPM과 함께 작동하도록 구성해야 합니다. 

1. PHP, PHP-FPM 설치

apt-get 또는 yum과 같은 운영 체제의 패키지 관리자를 사용하여 PHP를 설치하거나 소스에서 컴파일할 수 있습니다.

yum install php php-fpm -y


2. PHP-FPM 구성

php-fpm.conf 파일을 편집하여 PHP-FPM을 구성해야 합니다. 이 파일에는 수신 주소, 수신 포트 및 기타 PHP-FPM 옵션과 같은 설정이 포함되어 있습니다.

- www.conf의 내용을 아래와 같이 변경 (socket 방식 연동)

# vi /etc/php-fpm.d/www.conf

listen = /var/run/php-fpm/default.sock

listen.owner = apache
listen.group = apache

※ 참고
php-fpm 연동은 1) 소켓 방식과 2) tcp port 방식이 있는데, socket 방식이 더 빠르다고 함.
같은 서버 내에서 연동하는 경우는 socket 방식을,
다른 서버와 연동해야 하는 경우는 tcp port 방식을 사용하면 될 듯.

 

- 폴더 생성

/var/fun/php-fpm 폴더가 없다면 생성합니다.

mkdir /var/run/php-fpm


3. Apache 구성

mod_fastcgi 또는 mod_fcgid Apache 모듈을 설치한 후 Apache conf 파일을 수정해야 합니다.

- mod_fcgid 설치

yum install mod_fcgid -y

- php.conf 에 아래 내용 추가

# vi /etc/httpd/conf.d/php.conf

<Proxy "unix:/var/run/php-fpm/default.sock|fcgi://php-fpm">
    	ProxySet disablereuse=off
</Proxy>
 
<FilesMatch \.php$>
	SetHandler proxy:fcgi://php-fpm
</FilesMatch>
 
AddType text/html .php
 
DirectoryIndex index.php
 
<FilesMatch \.phps$>
	SetHandler application/x-httpd-php-source
</FilesMatch>

 

4. SSL 구성

SSL 보안접속을 사용하고 있다면, SSL conf 파일도 수정해주어야 합니다.

- ssl.conf 파일도 아래 내용 반영 (파일 마지막에, VirtualHost 태그 닫히기 전에 php-fpm 설정 내용 추가)

# vi /etc/httpd/ssl.conf

# [...]
#   Per-Server Logging: 
#   The home of a custom SSL log file. Use this when you want a 
#   compact non-error SSL logfile on a virtual host basis. 
CustomLog logs/ssl_request_log \ 
         "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" 
         
# configuration for php-fpm start
<Proxy "unix:/var/run/php-fpm/default.sock|fcgi://php-fpm"> 
  ProxySet disablereuse=off 
</Proxy> 
<FilesMatch \.php$> 
  SetHandler proxy:fcgi://php-fpm 
</FilesMatch>
# configuration for php-fpm end

</VirtualHost>

 

5. php-fpm 서비스 등록 및 실행

systemctl enable php-fpm
systemctl start php-fpm

 

6. apache 재시작

systemctl restart httpd

 

7. 사이트 접속하여 정상 동작하는지 확인

 

참고

https://docs.rockylinux.org/ko/guides/web/php/

https://wallydev.com/posts/4602d549-ecbd-11ed-a8d7-06aa2d67633f

https://www.baragi.net/bbs/board.php?bo_table=dev&wr_id=8771

https://serverok.in/centos-7-apache-use-php-fpm

https://webhostinghero.org/centos-apache-php-fpm/

 

웹사이트를 개발하다보면 문자열이 깨지는 경우가 종종 있다. 이는 인코딩 문제이다.

요새는 UTF-8 인코딩을 거의 표준처럼 사용하기에, 아래 모든 설정을 UTF-8로 통일 해주어야 문자열이 깨지지 않는다.

 

HTTP Header 설정

헤더 정보를 보낼 때, 아래와 같이 메타 태그로 charset=UTF-8을 넣어 보내야 함

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
워드프레스는, blog_charset 정보대로 아래처럼 http header의 charset이 설정됨
(wp_options 테이블에서 blog_charset 확인)
blog_charset	UTF-8	yes

 

PHP 인코딩 문제

php.ini 에 다음 설정 추가

default_charset = "utf-8"
mbstring.internal_encoding=UTF-8

 

DB 인코딩 문제

1. MariaDB 기본 Charset 확인

show variables like 'c%';

2. 데이터베이스 인코딩 확인

SELECT default_character_set_name, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE schema_name = "wordpress";

3. 테이블 인코딩 확인

SHOW FULL COLUMNS FROM wp_posts;

 

서버 인코딩 문제

httpd.conf 설정 확인

전체 설정 추가

AddDefaultCharset UTF-8

디렉토리별 인코딩 설정이 필요하다면, 아래와 같이 설정 추가

<Directory "/var/www/html">
    AddDefaultcharset UTF-8
</Directory>

 

 

운영체제 시스템 로케일 

특정 인코딩이나 Charset이 지정되지 않은 경우, 시스템 로케일을 사용하는 경우가 있으므로 시스템 로케일을 UTF-8로 설정해 준다.

현재 로케일 확인

[root@0000 modules]# localectl
   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us

가용한 모든 로케일 보기

locale -a

로케일 변경

'/etc/locale.conf' 파일 열어서 아래와 같이 변경 후, 아파치 재시작

LANG=ko_KR.UTF-8
sudo systemctl restart httpd

 

※ 참고
Media Type
A media type, also known as a MIME type or content type, is a string identifier that specifies the format of a file or the type of data being transmitted in a HTTP request or response. Media types are used to indicate the format of a file, such as text, image, audio, or video, so that the recipient's software can correctly interpret and display the data.

Multipart
The multipart media type is used to send multiple parts of a message as separate entities in a single HTTP request or response. Each part is treated as a separate entity with its own media type and content encoding. The "multipart" media type is typically used for file uploads, where the user wants to send multiple files in a single request.

Text
The "text" media type is used to indicate that the content of a HTTP request or response is plain text, as opposed to binary data. The "text" media type is typically used for text documents, such as HTML, CSS, and JavaScript files, as well as for plain text data, such as the contents of a form field in a web page.

In HTTP, media types are indicated in the "Content-Type" header of a request or response, and can be specified using a standard media type string, such as "text/plain" or "multipart/form-data".

 

[관련글] 인코딩의 개념과 종류 : https://life-coding.tistory.com/95

인코딩 (Encoding)

인코딩 이란

사람이 인지할 수 있는 문자(언어)를 약속된 규칙에 따라 컴퓨터가 이해하는 언어(0과 1)로 이루어진 코드로 바꾸는 것을 통틀어 일컫는다.

즉, encoding이란 정해진 규칙에 따라 코드화, 암호화, 부호화 하는 것을 말한다.

 

문자 셋 (Character Set) = 코드표

인코딩과 디코딩을 위해 미리 정해놓은 규칙으로, 초기 표준 문자열 셋은 ASCII 등이 있었음.

그러나 인터넷이 전 세계로 보급되면서 이로 표현할 수 없는 문자들이 등장하여 이들을 포함한 새로운 문자 셋이 등장하게 됨 (유니코드 등)

 

문자 인코딩과 문자 셋

- 문자 인코딩 : 문자를 컴퓨터가 이해할 수 있는 신호로 만드는 것

- 문자 셋 : 인코딩과 디코딩을 위해 미리 정해놓은 규칙 (매핑표)

 

 

인코딩의 종류

문자 인코딩, 사진&오디오&비디오 인코딩 등이 있다.

 

문자 인코딩 (Character Encoding)

"문자"를 "bytes (바이트)"로 변환시킨다.

 

ASCII Encoding

미국에서 정의하고 있는 표준, 영문 알파벳을 위한 대표적인 문자 인코딩

- 7bit 인코딩으로 총 1byte(8bit)에서 7bit을 사용하여 128개의 문자를 표현할 수 있음 (0~127)

- 나머지 1bit은 에러 검출을 위한 Parity bit으로 비워두어, 총 1 byte로 문자를 표현

(7개의 비트 중 1의 개수가 홀수면 1, 짝수면 0으로 설정된 Parity bit를 함께 전송함.)

 

확장아스키코드(Extended ASCII) = ANSI 코드

기존 아스키 코드의 7bit이 아닌 8bit을 문자를 표현하는데 사용하여 총 256개의 문자 표현이 가능함

 

멀티바이트 인코딩(Multibyte Encoding)

처음 멀티바이트 인코딩이 사용된 것은 CJK(Chinese-Japanese-Korean) 멀티바이트 인코딩으로

한국어, 중국어, 일본어는 문자의 수가 매우 많기 때문에 확장아스키코드 영역의 128개로도 부족했기 때문에 등장

따라서 1byte가 아닌 여러 byte를 통해 문자를 표현한 것이 멀티바이트 인코딩이다.

한국의 인코딩 방식은 여러 인코딩 방식을 거쳐왔다.

  • 조합형 한글 인코딩
    • 한글의 자음과 모음을 조합해서 표현 
    • 2byte 조합, 3byte 조합, N byte 조합과 같은 여러 방식을 사용
  • 완성형 한글 인코딩
    • 자음과 모음을 합쳐서 완성된 문자로 표현 
    • EUC-KR : 2350자 / CP949(MS949) : 11172자 를 사용

UNICODE Encoding

멀티바이트 인코딩 문제는 한국에 국한된 문제가 아니라, 중국어 일본어 등에도 발생한 문제

각자의 언어를 표현할 수 있는 인코딩 방식과 다른 문자열 셋을 사용하기에, 모든 언어를 동시에 표현할 수가 없었음

결국 전 세계의 모든 문자를 하나의 문자 셋으로 표현할 수 없을까? 라는 문제가 등장

이에 전 세계의 모든 문자 집합을 하나로 모아 탄생시킨 것이 유니코드

 

- 모든 문자를 2bytes로 표현하려 했으며, 이론적으로 65536개의 문자를 표현 가능

- 2bytes로 모두 담지 못하는 문자들이 있어(한글의 조합, 한자, 히라가나 등), 1byte로 평면을 나누어 총 2~3bytes를 통해 유니코드로 표현

- 유니코드 나타내는 U+와 16진수를 합쳐 U+0000 ~ U+FFFF 까지 문자 표현 가능

- 앞에 평면을 위한 1byte인 U+00에서 U+FF를 추가 가능 (총 256개의 평면 가능)

 

구현 방법에 따라 여러가지로 나뉨

* UTF-8 Encoding

유니코드 인코딩 중 가장 기본. 8bit을 기본으로 사용하며, ASCII 코드와 직접 호환 가능

하지만 가변 인코딩 방식이라 각 글자마다 1~4bytes로 상이한 바이트 수를 가지게 되어 string 조작이 힘듦

 

* UTF-32 Encoding

UTF-8과 반대로 최대 메모리를 사용. 각 글자는 고정된 4bytes의 넓이를 가지고 있어 string 조작이 간편해짐.

 

* UTF-16 Encoding

UTF-8과 UTF-32를 반반 섞은 인코딩

대부분의 글자를 고정된 너비(fixed width) 2bytes 를 가지고, 특수한 경우 이를 넘어가는 가변 너비를 가짐

 

Base64 Encoding

Binary Data를 Text로 바꾸는 Encoding(Binary-to-text encoding)의 하나로써,

Binary Data를 Character set에 영향 받지 않는 공통 ASCII 영역의 문자로만 이루어진 문자열로 바꾸는 인코딩

* 사용하는 이유

- 문자를 전송하기 위해 설계된 Media(Email, HTML) 등을 이용해 플랫폼 독립적으로 Binary Data(이미지나 오디오)를 전송할 필요가 있을 때, ASCII로 전송하게 되면 나오는 문제를 해결하기 위해 등장

- 문제 1. ASCII는 7bit encoding인데 나머지 1bit을 처리하는 방식이 시스템별로 상이함

- 문제 2. 일부 제어문자의 경우, 시스템별로 다른 코드값을 가짐

이에 ASCII는 시스템간 데이터 전달에 안전하지가 않기에, Base64는 ASCII 중 제어문자와 일부 특수문자를 제외한 64개의 안전한 출력 문자만 사용하여 인코딩함

 

URL Encoding

인터넷을 통해 전송될 수 있는 포맷으로 문자를 변환시키는 인코딩 방식 

* 사용하는 이유

- URL은 ASCII 셋 문자 집합만을 사용하기에, 그 외의 문자는 유효한 ASCII 형식으로 변환되어야 함 ('%XX' 의 형식)

- ASCII 문자라도 예약된 의미를 가지는 경우, 예약된 의미가 아닌 문자 자체의 의미를 전달하고 싶은 경우 이스케이프 처리가 필요하기 때문

* 형식

- 기존 문자열의 HEX값 앞에 '%' tkdyd

- 한글 : UTF-8 사용

 

HTML Encoding

HTML 문서 안에 있는 특정한 문자들을 안전하게 브라우저에 표시하기 위해 사용되는 인코딩

* 사용하는 이유

- HTML 내에서 스크립트와 같이 특수한 기능을 하는 문자들을 안전하게 표현하여 보안성을 높이기 위해 사용함

- XSS(크로스 사이트 스크립트) 의 방어 대책으로 사용됨

* 형식

- ASCII 코드값을 기준으로 인코딩 됨

- 코드의 앞에 %# 문자가 포함됨

 

디코딩(Decoding)

인코딩의 반대되는 개념으로 복호화, 역코드화의 의미를 가짐

컴퓨터가 이해하는 언어를 사람이 이해할 수 있는 언어로 바꾸는 것

 

참고

https://simyj.tistory.com/14

https://effectivesquid.tistory.com/entry/Base64-%EC%9D%B8%EC%BD%94%EB%94%A9%EC%9D%B4%EB%9E%80

https://limvo.tistory.com/7

MariaDB 기본 Charset 확인하기

MariaDB [(none)]> show variables like 'c%';
+----------------------------------+----------------------------+
| Variable_name                    | Value                      |
+----------------------------------+----------------------------+
| character_set_client             | utf8mb4                    |
| character_set_connection         | utf8mb4                    |
| character_set_database           | utf8mb4                    |
| character_set_filesystem         | binary                     |
| character_set_results            | utf8mb4                    |
| character_set_server             | utf8mb4                    |
| character_set_system             | utf8mb3                    |
| character_sets_dir               | /usr/share/mysql/charsets/ |
| check_constraint_checks          | ON                         |
| collation_connection             | utf8mb4_general_ci         |
| collation_database               | utf8mb4_general_ci         |
| collation_server                 | utf8mb4_general_ci         |
| column_compression_threshold     | 100                        |
| column_compression_zlib_level    | 6                          |
| column_compression_zlib_strategy | DEFAULT_STRATEGY           |
| column_compression_zlib_wrap     | OFF                        |
| completion_type                  | NO_CHAIN                   |
| concurrent_insert                | AUTO                       |
| connect_timeout                  | 10                         |
| core_file                        | OFF                        |
+----------------------------------+----------------------------+

 

 

데이터베이스의 인코딩 확인하기

MariaDB [(none)]> SELECT default_character_set_name, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE schema_name = "wordpress";
+----------------------------+------------------------+
| default_character_set_name | DEFAULT_COLLATION_NAME |
+----------------------------+------------------------+
| utf8mb4                    | utf8mb4_general_ci     |
+----------------------------+------------------------+

 

테이블의 인코딩 확인하기

결과 중에 Collation 컬럼 확인해보면 된다.

MariaDB [wordpress]> SHOW FULL COLUMNS FROM wp_posts;
+-----------------------+---------------------+--------------------+------+-----+---------------------+----------------+---------------------------------+---------+
| Field                 | Type                | Collation          | Null | Key | Default             | Extra          | Privileges                      | Comment |
+-----------------------+---------------------+--------------------+------+-----+---------------------+----------------+---------------------------------+---------+
| ID                    | bigint(20) unsigned | NULL               | NO   | PRI | NULL                | auto_increment | select,insert,update,references |         |
| post_author           | bigint(20) unsigned | NULL               | NO   | MUL | 0                   |                | select,insert,update,references |         |
| post_date             | datetime            | NULL               | NO   |     | 0000-00-00 00:00:00 |                | select,insert,update,references |         |
| post_date_gmt         | datetime            | NULL               | NO   |     | 0000-00-00 00:00:00 |                | select,insert,update,references |         |
| post_content          | longtext            | utf8mb4_unicode_ci | NO   |     | NULL                |                | select,insert,update,references |         |
| post_title            | text                | utf8mb4_unicode_ci | NO   |     | NULL                |                | select,insert,update,references |         |
| post_excerpt          | text                | utf8mb4_unicode_ci | NO   |     | NULL                |                | select,insert,update,references |         |
| post_status           | varchar(20)         | utf8mb4_unicode_ci | NO   |     | publish             |                | select,insert,update,references |         |
| comment_status        | varchar(20)         | utf8mb4_unicode_ci | NO   |     | open                |                | select,insert,update,references |         |
| ping_status           | varchar(20)         | utf8mb4_unicode_ci | NO   |     | open                |                | select,insert,update,references |         |
| post_password         | varchar(255)        | utf8mb4_unicode_ci | NO   |     |                     |                | select,insert,update,references |         |
| post_name             | varchar(200)        | utf8mb4_unicode_ci | NO   | MUL |                     |                | select,insert,update,references |         |
| to_ping               | text                | utf8mb4_unicode_ci | NO   |     | NULL                |                | select,insert,update,references |         |
| pinged                | text                | utf8mb4_unicode_ci | NO   |     | NULL                |                | select,insert,update,references |         |
| post_modified         | datetime            | NULL               | NO   |     | 0000-00-00 00:00:00 |                | select,insert,update,references |         |
| post_modified_gmt     | datetime            | NULL               | NO   |     | 0000-00-00 00:00:00 |                | select,insert,update,references |         |
| post_content_filtered | longtext            | utf8mb4_unicode_ci | NO   |     | NULL                |                | select,insert,update,references |         |
| post_parent           | bigint(20) unsigned | NULL               | NO   | MUL | 0                   |                | select,insert,update,references |         |
| guid                  | varchar(255)        | utf8mb4_unicode_ci | NO   |     |                     |                | select,insert,update,references |         |
| menu_order            | int(11)             | NULL               | NO   |     | 0                   |                | select,insert,update,references |         |
| post_type             | varchar(20)         | utf8mb4_unicode_ci | NO   | MUL | post                |                | select,insert,update,references |         |
| post_mime_type        | varchar(100)        | utf8mb4_unicode_ci | NO   |     |                     |                | select,insert,update,references |         |
| comment_count         | bigint(20)          | NULL               | NO   |     | 0                   |                | select,insert,update,references |         |
+-----------------------+---------------------+--------------------+------+-----+---------------------+----------------+---------------------------------+---------+

utf8과 utf8mb4의 차이

UTF-8 and UTFMB4 are character sets used in MySQL to store text data.

UTF-8 is a character encoding that can represent a wide range of characters and symbols, including most of the characters used in the world's written languages. UTF-8 is a variable-width encoding, which means that characters can take up anywhere from 1 to 4 bytes of storage space in a database.

UTFMB4 is an extension of UTF-8 that can store a wider range of characters, including emoji and other special symbols. UTFMB4 uses a maximum of 4 bytes to encode characters, which makes it more memory-intensive than UTF-8.

In general, if you need to store text data that includes a limited range of characters, UTF-8 is a good choice. However, if you need to store a wider range of characters, including emoji and special symbols, UTFMB4 is the better choice. It's important to note that using UTFMB4 requires a more powerful database setup and can lead to increased memory usage, so it may not be appropriate for all applications.

 

utf8bm4_general_ci  와 utf7mb4_unicode_ci의 차이

UTF8MB4_GENERAL_CI and UTF8MB4_UNICODE_CI are collation types for UTF8MB4 character sets in MySQL.

A collation determines how text data is compared and sorted in a database. The collation type you choose affects how text data is treated in comparison operations, such as equal to (==), not equal to (!=), greater than (>), and less than (<).

UTF8MB4_GENERAL_CI is a case-insensitive collation that sorts text data in a way that is suitable for most applications. It only considers the basic letter and number characters and ignores special characters and symbols.

UTF8MB4_UNICODE_CI, on the other hand, is a case-insensitive collation that takes into account the full range of Unicode characters, including special symbols and emoji. This collation type is more suitable for applications that need to handle a wide range of characters, such as multilingual websites.

In general, UTF8MB4_GENERAL_CI is faster and uses less memory than UTF8MB4_UNICODE_CI, but it provides less accurate comparison results for special characters and symbols. UTF8MB4_UNICODE_CI provides more accurate comparison results, but is slower and uses more memory.

The choice between UTF8MB4_GENERAL_CI and UTF8MB4_UNICODE_CI depends on the specific needs of your application and the text data that you need to store in your database.

윈도우 운영체제에서 php 7.4를 설치하고, VScode 디버깅 설정하는 방법을 정리한다.

 

PHP 7.4 설치

1. 아래 사이트에서 windows용 php를 다운받는다. (설치할 버전)

https://windows.php.net/download/

 

2. 적절한 폴더에 압축을 해제한다.

예) C:/APM/php-7.4.33-Win32-vc15-x64

 

3. httpd.conf 파일 설정에서, php 경로를 변경해준다.

PHPIniDir "C:/APM/php-7.4.33-Win32-vc15-x64"
LoadModule php7_module "C:/APM/php-7.4.33-Win32-vc15-x64/php7apache2_4.dll"
AddType application/x-httpd-php .html .php
AddHandler application/x-httpd-php .php

 

4. 고급 시스템 설정에 php 경로를 등록해준다. (어디서든 php.exe 실행 가능하게 하려면)

예) C:/APM/php-7.4.33-Win32-vc15-x64 추가

 

5. 아파치를 재시작한다.

서비스 > Apache2.4 다시시작

 

VScode 에 php 디버깅 설정

1. cmd 창에 "php -i" 입력하면 phpinfo 내용이 쭉 나온다. 전부 복사한다.

 

2. https://xdebug.org/wizard 사이트에 가서 해당 내용을 붙여넣는다.

 

3. Analyse my phpinfo() output 버튼을 클릭한다.

 

4. 내 정보가 나오고, 해당 내용에 맞는 dll을 다운받을 수 있는 녹색 링크가 나온다. 클릭해서 다운받는다.

5. php 압축 푼 폴더 하위에 해당 dll을 복사한다.

예) C:\APM\php-7.2.34-Win32-VC15-x64\ext\php_xdebug-3.0.0-7.2-vc15-x86_64.dll

 

6. cmd 창에 php -m 입력해서 [PHP Modules]와 [Zend Modules]에 Xdebug가 있는지 확인한다.

 

7. php.ini 파일 설정을 변경한다.

- 기존 설정이 있는 경우, 동일하게 맞춤

- 디버깅을 위해, 아래와 같이 xDebug 설정을 추가한다.

예) C:/PHP/php-7.4.33-Win32-vc15-x64/php.ini 

[xDebug]
zend_extension = C:/APM/php-7.4.33-Win32-vc15-x64/ext/php_xdebug-3.1.6-7.4-vc15-x86_64.dll
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host = localhost
xdebug.client_port = 9003
xdebug.output_dir = C:/APM/php-7.4.33-Win32-vc15-x64/tmp

 

8. 아파치를 재시작한다.

 

9. VScode를 열어, launch.json 파일 내용을 아래와 같이 수정한다.

(위 php.ini 에서 설정한 port 가 일치하도록 하고, php가 설치된 경로를 넣어준다.)

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "runtimeExecutable": "C:/APM/php-7.4.33-Win32-vc15-x64/php.exe",
            "request": "launch",
            "port": 9003
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "runtimeExecutable": "C:/APM/php-7.4.33-Win32-vc15-x64/php.exe",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9003
        },
        {
            "name": "Launch Index",
            "type": "php",
            "runtimeExecutable": "C:/APM/php-7.4.33-Win32-vc15-x64/php.exe",
            "request": "launch",
            "program": "${workspaceRoot}/index.php",
            "cwd": "${workspaceRoot}",
            "port": 9003
        }
    ]
}

 

10. VScode에서 settings.json을 열어 php path를 아래와 같이 바꾸어준다.

    "php.validate.executablePath": "C:/APM/php-7.4.33-Win32-vc15-x64/php.exe",
    "php.validate.enable": false,
    "php.executablePath": "C:/APM/php-7.4.33-Win32-vc15-x64/php.exe",

 

11. 테스트용 index.php 파일 만들고, VScode에서 F5 눌러 디버깅 모드 실행한다.

 

12. 웹 브라우저에서 index.php를 실행해본다. 디버깅이 걸리면 성공!

+ Recent posts