유니코드 때문에 시스템이 SMS를 여러 건으로 나누어 발송하면서 SMS 요금이 급격히 치솟는 것을 경험하셨다면, 이를 해결하는 방법이 현재 가장 시급한 고민일 것입니다. 실수로 입력한 스마트 따옴표(smart quote)나 이모지 하나 때문에 저렴한 표준 텍스트 메시지가 순식간에 3개의 별도 요금 세그먼트로 나뉘어 마케팅 및 운영 예산을 낭비하게 될 수 있습니다.

Step 1: Understand Why Unicode Forces Multiple SMS Segments

SMS 게이트웨이가 단일 메시지를 여러 개의 유료 세그먼트로 분할하는 것을 막으려면, 먼저 SMS 인코딩의 기술적 메커니즘을 이해해야 합니다. 기존 이동통신 네트워크는 텍스트 메시지에 주로 두 가지 인코딩 표준인 GSM-7UCS-2 (Unicode)를 사용합니다.

표준 GSM-7 인코딩 방식에서는 단일 SMS 세그먼트에 최대 160자까지 담을 수 있습니다. 이 문자 집합에는 표준 라틴 문자(A-Z, a-z), 숫자(0-9) 및 몇 가지 일반적인 문장 부호가 포함됩니다. 하지만 메시지 내용에 둥근 따옴표(’), 악센트가 있는 문자(á, é, ö) 또는 이모지와 같이 이 기본 집합을 벗어나는 문자가 단 하나라도 포함되는 순간, 전체 메시지 인코딩은 자동으로 UCS-2로 전환됩니다.

메시지가 UCS-2 Unicode 인코딩으로 전환되면 세그먼트당 문자 제한이 160자에서 단 70자로 급감합니다. 메시지 길이가 140자라면 GSM-7 세그먼트 하나에 쉽게 들어갈 수 있습니다. 하지만 UCS-2에서는 동일한 140자 메시지를 보내는 데 두 개의 별도 세그먼트가 필요합니다. Twilio, Vonage, MessageBird와 같은 기존 API 제공업체는 세그먼트당 요금을 부과하므로, 단 한 건의 메시지 비용이 즉시 두 배 또는 세 배로 늘어납니다.

Encoding StandardMax Characters (1 Segment)Max Characters (Multi-Segment)Common Trigger Characters
GSM-7160 characters153 characters per segmentStandard English letters, numbers, basic punctuation
UCS-2 (Unicode)70 characters67 characters per segmentEmojis, smart quotes (“, ”), non-Latin alphabets, accents (é, ñ)

이러한 현상 때문에 애플리케이션이 Unicode의 영향으로 SMS를 여러 건으로 나누어 보내게 되는 것입니다. 이를 해결하려면 입력 데이터를 엄격하게 정제(sanitize)하거나, 더 길고 현대적인 텍스트 메시지를 보내도 불이익을 주지 않는 low cost sms api로 전환해야 합니다.

Step 2: Strip or Replace Unicode Characters in Your Code

Unicode 분할을 방지하는 가장 즉각적인 프로그래밍 방식은 SMS 게이트웨이로 메시지를 보내기 전에 메시지 본문을 정제하는 것입니다. 백엔드에서 유틸리티 함수를 작성하여 non-GSM-7 문자를 제거하거나 가장 유사한 GSM-7 대응 문자로 대체할 수 있습니다.

다음은 간단한 정규식 패턴과 문자열 대체 규칙을 사용하여 여러 프로그래밍 언어로 이를 구현하는 방법입니다.

Python Implementation

Python에서는 unicodedata 모듈을 사용하여 문자열을 정규화하고, 악센트를 제거하며, 스마트 따옴표를 표준 곧은 따옴표로 변환할 수 있습니다.

import unicodedata
import re

def clean_for_gsm7(text):
    # Replace common smart quotes and dashes
    replacements = {
        u'\u201c': '"', u'\u201d': '"',
        u'\u2018': "'", u'\u2019': "'",
        u'\u2013': '-', u'\u2014': '-'
    }
    for unicode_char, gsm_char in replacements.items():
        text = text.replace(unicode_char, gsm_char)
    
    # Normalize and strip accents
    normalized = unicodedata.normalize('NFKD', text)
    ascii_text = normalized.encode('ascii', 'ignore').decode('utf-8')
    
    # Remove any remaining non-GSM-7 characters
    gsm7_regex = re.compile(r'[^

 a-zA-Z0-9^{}\\[~]|€$@!"#%&'()*+,-./:;<=>?_]')
    cleaned_text = gsm7_regex.sub('', ascii_text)
    
    return cleaned_text

message = "Hello! Your appointment is scheduled for tomorrow at 3 PM. See you there! 😊"
print(clean_for_gsm7(message))
# Output: "Hello! Your appointment is scheduled for tomorrow at 3 PM. See you there! "

Node.js (JavaScript) Implementation

JavaScript 개발자의 경우, 정규식을 사용하여 GSM-7 표준을 준수하지 않는 문자를 제거하는 유사한 접근 방식을 사용할 수 있습니다.

function sanitizeToGSM7(text) {
    const smartReplacements = {
        '[\u201c\u201d]': '"',
        '[\u2018\u2019]': "'",
        '\u2013': '-',
        '\u2014': '-'
    };

    let cleaned = text;
    for (const [pattern, replacement] of Object.entries(smartReplacements)) {
        cleaned = cleaned.replace(new RegExp(pattern, 'g'), replacement);
    }

    // Remove accents
    cleaned = cleaned.normalize('NFD').replace(/[\u0300-\u036f]/g, '');

    // Keep only GSM-7 compatible characters
    const gsm7Pattern = /[^

 a-zA-Z0-9^{}\\[~]|€$@!"#%&'()*+,-.\/:;<=>?_]/g;
    return cleaned.replace(gsm7Pattern, '');
}

const rawMessage = "Your order is ready for pickup! 🚗";
console.log(sanitizeToGSM7(rawMessage)); 
// Output: "Your order is ready for pickup! "

Step 3: Convert Smart Quotes and Accents to GSM-7 Equivalents

Unicode 문자는 Microsoft Word나 Google Docs와 같은 워드 프로세서에서 복사하여 붙여넣는 과정에서 메시지에 유입되는 경우가 많습니다. 이러한 워드 프로세서들은 표준 곧은 따옴표('")를 자동으로 둥근 "스마트" 따옴표(, , , )로 변환합니다.

이러한 미세한 변화로 인해 시스템이 여러 개의 SMS를 보내는 것을 방지하기 위해 문자 매핑 테이블을 설정할 수 있습니다. 이를 통해 70자 제한의 UCS-2가 발동되지 않도록 하면서도 텍스트의 가독성을 유지할 수 있습니다.

  • 를 표준 아포스트로피 '로 변환
  • 를 표준 따옴표 "로 변환
  • 엠대시() 및 엔대시()를 표준 하이픈(-)으로 변환
  • é, á, í와 같이 악센트가 있는 문자를 악센트가 없는 대응 문자인 e, a, i로 변환

이러한 문자들을 명시적으로 매핑하면, 단일 세그먼트 제한을 엄격하게 준수하면서도 메시지의 전문적인 외관을 유지할 수 있습니다. 이는 자동 예약 업데이트를 발송하면서 운영 비용을 낮게 유지해야 하는 치과, 정비소, 어학원과 같은 지역 서비스 비즈니스에 특히 유용합니다.

Step 4: Switch to an SMS Gateway with Flat-Rate Segment Billing

Unicode 문자를 제거하는 것은 실용적인 해결책이 될 수 있지만, 브랜드의 어조를 타협해야 한다는 단점이 있습니다. 2026년의 고객들은 이모지, 현지화된 악센트, 전문적인 서식이 포함된 자연스러운 소통을 기대합니다. 높은 통신 요금을 피하기 위해 고객과의 소통을 기본 ASCII 문자로만 제한할 필요는 이제 없습니다.

Twilio, Plivo, MessageBird와 같은 기존 클라우드 애그리게이터들은 모든 데이터 패킷에 대해 통신사 수수료를 지불해야 하므로 엄격한 세그먼트당 요금제를 적용합니다. 또한 이러한 기존 플랫폼을 사용하려면 복잡한 A2P SMS 등록, 10DLC 통신사 승인, 매월 반복되는 수수료 등을 처리해야 합니다.

점점 더 인기를 얻고 있는 대안은 Android 기반 SMS 게이트웨이인 MySMSGate를 사용하는 것입니다. MySMSGate는 사용자의 Android 휴대폰과 SIM 카드를 완전한 기능을 갖춘 SMS 발송 장치로 바꿔줍니다. 메시지가 휴대폰의 SIM 카드(보통 무제한 또는 대폭 할인된 현지 SMS 번들이 포함됨)를 통해 직접 발송되므로, 기존의 세그먼트 기반 요금제를 완전히 우회할 수 있습니다.

MySMSGate는 메시지에 Unicode 문자나 이모지가 포함되어 있거나 여러 세그먼트에 걸쳐 있더라도 상관없이 발송 성공한 SMS당 $0.02의 고정 요금을 부과합니다. 월간 구독료도 없고, 계약도 없으며, 통신사 등록 대기 시간도 없습니다. 메시지 전송에 실패하면 잔액이 자동으로 환불됩니다.

대량 SMS 비교, 신뢰성 및 도달률 측면에서 best SMS API alternatives for bulk SMS comparison, reliability, and delivery rates을 찾고 계신다면, Android SMS 게이트웨이로 전환하여 Unicode 요금 문제의 근본 원인을 해결할 수 있습니다.

Step 5: Set Up Text Message from Multiple Phone Numbers Management

여러 위치에서 운영되는 지역 서비스 비즈니스의 경우, 메시징 인프라 관리가 빠르게 복잡해질 수 있습니다. 5개의 치과 클리닉이나 3개의 자동차 정비소와 같이 여러 지점을 관리하는 경우, 단일 중앙 인터페이스에서 text message from multiple phone numbers management를 지원하는 시스템이 필요합니다.

MySMSGate를 사용하면 단일 계정 대시보드에 무제한의 Android 기기를 연결할 수 있습니다. 이를 통해 여러 번호를 원활하게 관리할 수 있습니다:

  1. 계정 생성: MySMSGate에 가입하여 API 키를 발급받습니다.
  2. Android 앱 설치: Android 기기에 MySMSGate 컴패니언 앱을 다운로드합니다.
  3. QR 코드로 연결: 각 휴대폰의 카메라를 사용하여 웹 대시보드에 표시된 QR 코드를 스캔합니다. 이렇게 하면 복잡한 API 키를 입력할 필요 없이 기기가 중앙 계정에 즉시 연결됩니다.
  4. 듀얼 SIM 관리: 휴대폰이 듀얼 SIM을 지원하는 경우, 대시보드 또는 API 호출 내에서 메시지를 보낼 SIM 슬롯을 직접 선택할 수 있습니다.

이러한 다중 기기 구조를 통해 고객에게 친숙한 지역 번호로 알림 메시지를 발송할 수 있어 오픈율과 응답률을 크게 높일 수 있습니다. 수신되는 모든 답장은 웹 기반의 Web Conversations 대시보드로 자동으로 전달되므로 컴퓨터에서 직접 실시간 양방향 채팅이 가능합니다.

Step 6: Send Your First Unicode-Safe SMS via REST API

1인 개발자, 프리랜서 또는 기술 지식을 갖춘 비즈니스 소유자라면 MySMSGate를 소프트웨어에 연동하는 것이 매우 간단합니다. 이 플랫폼은 최소한의 설정만으로 SMS 알림을 트리거할 수 있는 깔끔한 단일 엔드포인트 REST API를 제공합니다.

다음은 cURL을 사용하여 SMS를 발송하는 POST 요청의 예시입니다. 세그먼트 비용 증가에 대한 걱정 없이 이모지와 특별한 Unicode 문자를 포함할 수 있습니다:

curl -X POST https://mysmsgate.net/api/v1/send \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+1234567890",
    "message": "Your vehicle is ready for pickup! 🚗 Please reply to this message if you have any questions.",
    "device_id": "your_device_id",
    "sim_slot": 1
  }'

더 자세한 언어별 구현 방법은 공식 MySMSGate API documentation에서 확인할 수 있으며, 여기에는 Python, Node.js, PHP, Go, Ruby용 즉시 사용 가능한 코드 스니펫과 Zapier, Make.com, n8n과 같은 자동화 플랫폼용 사전 빌드된 커넥터가 포함되어 있습니다.

Frequently Asked Questions

유니코드 SMS 분할, 문자 제한 및 요금 체계와 관련하여 가장 자주 묻는 질문에 대한 답변입니다.

Why does one emoji make my SMS send as multiple messages?

표준 텍스트 메시지는 GSM-7 인코딩을 사용하여 세그먼트당 최대 160자까지 전송할 수 있습니다. 이모지는 GSM-7 문자 집합에 속하지 않습니다. 이모지를 추가하면 통신사는 전체 메시지를 UCS-2(유니코드) 인코딩으로 전환해야 하며, 이로 인해 세그먼트 제한이 70자로 줄어듭니다. 메시지가 70자보다 길면 여러 세그먼트로 분할되며, 기존 API는 각 세그먼트마다 요금을 부과합니다.

How can I check if my text contains Unicode before sending?

온라인 SMS 길이 계산기를 사용하거나 코드에서 간단한 정규식 검색을 실행하여 non-GSM-7 문자를 감지할 수 있습니다. 또는 아웃바운드 SMS 대기열로 전달하기 전에 데이터베이스에서 non-GSM-7 문자를 감지하여 표시하거나 제거하는 유효성 검사 스크립트를 작성할 수 있습니다.

Does MySMSGate charge extra for Unicode or multi-segment messages?

아니요. 160자 또는 70자 세그먼트당 요금을 부과하는 Twilio나 Vonage 같은 기존 API와 달리, MySMSGate는 발송 성공한 메시지당 $0.02의 고정 요금을 부과합니다. 메시지가 Android 휴대폰의 SIM 카드를 통해 직접 라우팅되므로 세그먼트당 비용을 지안하며, 숨겨진 요금 걱정 없이 이모지와 긴 메시지를 보낼 수 있습니다.

Do I need carrier or 10DLC registration to use an Android SMS gateway?

아니요. MySMSGate는 사용자의 실제 Android 휴대폰과 SIM 카드를 통해 메시지를 라우팅하므로 메시지가 표준 개인 간(P2P) 트래픽으로 전송됩니다. 즉, 복잡하고 비용이 많이 들며 시간이 오래 걸리는 A2P 10DLC 등록을 거치거나 통신사 승인을 기다릴 필요가 없습니다.