본문 바로가기
프로그램 (PHP,Python)

한글깨짐 환경 인코딩 UTF-8 유니코드 변환 문제 해결

by 날으는물고기 2024. 1. 2.

한글깨짐 환경 인코딩 UTF-8 유니코드 변환 문제 해결

Javarevisited: Difference between UTF-8, UTF-16 and UTF-32 Character Encoding? Example

파이썬을 사용하여 JSON 파일의 UTF-8 여부를 체크하고, 만약 UTF-8이 아니라면 인코딩을 변경하는 코드는 다음과 같이 작성할 수 있습니다. 이 코드는 chardet 라이브러리를 사용합니다. 먼저, 해당 라이브러리를 설치해야 합니다.

pip install chardet

그런 다음 아래의 파이썬 코드를 사용하세요.

import json
import chardet

def check_and_convert_encoding(file_path, target_encoding='utf-8'):
    with open(file_path, 'rb') as file:
        raw_data = file.read()
        result = chardet.detect(raw_data)
        detected_encoding = result['encoding']

    if detected_encoding.lower() != target_encoding.lower():
        # 인코딩이 UTF-8이 아닌 경우
        with open(file_path, 'r', encoding=detected_encoding) as file:
            data = json.load(file)

        with open(file_path, 'w', encoding=target_encoding) as file:
            json.dump(data, file, ensure_ascii=False, indent=2)

        print(f'인코딩을 {detected_encoding}에서 {target_encoding}으로 변경하였습니다.')
    else:
        print('이미 UTF-8로 인코딩되어 있습니다.')

# 파일 경로를 적절히 수정하세요
file_path = 'path/to/your/file.json'
check_and_convert_encoding(file_path)

이 코드에서 file_path 변수에는 대상 JSON 파일의 경로를 입력하세요. 코드는 파일의 인코딩을 체크하고, UTF-8이 아니면 해당 인코딩으로 변경한 후에 메시지를 출력합니다.

 

리눅스 서버에서 주요 보안설정 값을 JSON으로 저장하고, 중앙 서버로 수집하는 과정을 자동화하고, 필요한 경우 UTF-8로 변환하는 방법은 여러가지가 있습니다. 여기서는 SSH를 사용하여 원격 서버에서 정보를 수집하고, 수집된 데이터를 중앙 서버로 전송하며, 필요한 경우 인코딩을 변환하는 간단한 스크립트를 작성하는 방법을 안내하겠습니다.

 

리눅스 서버 스크립트 (collect_and_store_info.sh)

#!/bin/bash

# 주요 보안설정 값을 JSON으로 저장하는 스크립트

# JSON 파일 경로 및 파일명 지정
JSON_FILE="/path/to/security_settings.json"

# 보안설정 정보 수집 및 JSON 파일 생성
security_info=$(command_to_collect_security_info)
echo "$security_info" > "$JSON_FILE"

중앙 서버 스크립트 (collect_from_servers.py)

파이썬 스크립트를 사용하여 여러 리눅스 서버로부터 정보를 수집하고 중앙 서버에 저장합니다. 이 때, 필요에 따라 인코딩을 변환합니다.

import paramiko
import json
import chardet

def collect_from_server(hostname, username, password, remote_script_path):
    # SSH 연결 설정
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    # SSH 연결
    ssh.connect(hostname, username=username, password=password)

    # 원격 서버 스크립트 실행
    stdin, stdout, stderr = ssh.exec_command(f'bash {remote_script_path}')
    collected_data = stdout.read().decode()

    # 연결 종료
    ssh.close()

    return collected_data

def save_to_central_server(data, json_file_path, target_encoding='utf-8'):
    # 인코딩 체크
    result = chardet.detect(data.encode())
    detected_encoding = result['encoding']

    if detected_encoding.lower() != target_encoding.lower():
        # 인코딩이 UTF-8이 아닌 경우 변환
        data = data.decode(detected_encoding).encode(target_encoding)

    # JSON 파일로 저장
    with open(json_file_path, 'w', encoding=target_encoding) as file:
        json.dump(json.loads(data), file, ensure_ascii=False, indent=2)

if __name__ == "__main__":
    # 각 서버의 정보
    server_info_list = [
        {'hostname': 'server1.example.com', 'username': 'your_username', 'password': 'your_password'},
        {'hostname': 'server2.example.com', 'username': 'your_username', 'password': 'your_password'},
        # 추가 서버 정보 추가
    ]

    # 중앙 서버에 저장할 JSON 파일 경로
    central_json_file = '/path/to/central/security_settings.json'

    for server_info in server_info_list:
        collected_data = collect_from_server(server_info['hostname'], server_info['username'], server_info['password'], '/path/to/collect_and_store_info.sh')
        save_to_central_server(collected_data, central_json_file)

이 코드에서는 paramiko 라이브러리를 사용하여 SSH 연결을 수행하고, 서버에서 스크립트를 실행하여 데이터를 수집합니다. 그리고 중앙 서버에 수집된 데이터를 저장할 때, 필요한 경우 인코딩을 변환합니다. 이는 각 서버의 인코딩이 다를 때 중요합니다.

 

이 스크립트를 실행하면, 각 리눅스 서버에서 수집한 정보가 중앙 서버에 JSON 파일로 저장됩니다. 이렇게 중앙에서 데이터를 수집하면 서버 간의 인코딩 차이에 대한 문제를 해결할 수 있습니다.

iconv 명령어를 사용하는 것도 유효한 방법이며, 여러 서버에서 데이터를 수집하고 중앙 서버에 저장하는 프로세스에서 iconv를 사용하여 인코딩을 변환할 수 있습니다. iconv는 리눅스와 다양한 유닉스 시스템에서 지원되는 명령어로, 텍스트 파일의 인코딩을 변환하는데 사용됩니다.

 

아래는 iconv를 사용하여 데이터를 변환하는 방법을 포함한 스크립트의 예제입니다. 이 예제는 중앙 서버에서 서버로부터 수집된 JSON 파일을 읽어들이고, 필요한 경우에 iconv를 사용하여 인코딩을 변환한 후 중앙 서버에 저장하는 방법을 보여줍니다.

#!/bin/bash

# 중앙 서버에서 실행되는 스크립트 (collect_from_servers.sh)

# 각 서버의 정보
server_info_list=("server1" "server2" "server3")

# 중앙 서버에 저장할 JSON 파일 경로
central_json_file="/path/to/central/security_settings.json"

for server in "${server_info_list[@]}"; do
    # 서버로부터 데이터 수집
    ssh user@$server 'bash /path/to/collect_and_store_info.sh' > "${server}_data.json"

    # 필요한 경우 인코딩 변환
    iconv -f detected_encoding -t utf-8 "${server}_data.json" > "${server}_utf8_data.json"

    # 중앙 서버 파일에 병합 또는 저장
    cat "${server}_utf8_data.json" >> "$central_json_file"
done

이 스크립트에서 iconv 명령어의 -f 옵션은 원본 파일의 인코딩을 지정하고, -t 옵션은 대상 파일의 인코딩을 지정합니다. 위의 스크립트에서는 detected_encoding에 해당 서버에서 수집한 데이터의 실제 인코딩을 설정해야 합니다. 이 부분은 chardet 또는 다른 방법을 사용하여 실제로 수집된 데이터의 인코딩을 검출하여 설정할 수 있습니다.

 

두 가지 방법 중 어떤 것을 선택할지는 상황에 따라 다를 수 있습니다. iconv 명령어는 명령행 도구로서 간단하게 사용할 수 있지만, 파이썬 스크립트를 사용하는 경우 더 많은 유연성을 제공할 수 있습니다.

728x90

댓글